Misc semantics fixes:

- don't allow pre-array object versions to return a struct containing an array 
 - special case -2147483648 / -1
 - include "~" in the full integer functionality checks
 - handle multiple function parameters having the same name



git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24010 e7fa87d3-cd2b-0410-9028-fcbf551c1848
This commit is contained in:
John Kessenich 2013-11-12 01:02:51 +00:00
parent 09709c1521
commit 67c9f3a720
9 changed files with 118 additions and 22 deletions

View File

@ -133,8 +133,17 @@ void foo246()
texture2DProj(highExt, v[2]); texture2DProj(highExt, v[2]);
texture3D(sExt, vec3(f13)); // ERROR texture3D(sExt, vec3(f13)); // ERROR
texture2DProjLod(sExt, vec3(f13), f13); // ERROR texture2DProjLod(sExt, vec3(f13), f13); // ERROR
int a;
~a; // ERROR
a | a; // ERROR
a & a; // ERROR
} }
#extension GL_OES_EGL_image_external : disable #extension GL_OES_EGL_image_external : disable
int foo203940(int a, float b, float a) // ERROR, a redefined
{
return a;
}
uniform samplerExternalOES badExt; // syntax ERROR uniform samplerExternalOES badExt; // syntax ERROR

View File

@ -39,3 +39,31 @@ void main()
gl_FragData[-1] = vec4(1.0); // ERROR gl_FragData[-1] = vec4(1.0); // ERROR
gl_FragData[3] = vec4(1.0); gl_FragData[3] = vec4(1.0);
} }
struct SA {
vec3 v3;
vec2 v2[4];
};
struct SB {
vec4 v4;
SA sa;
};
SB bar9()
{
SB s;
return s; // ERROR
}
void bar10(SB s) // okay
{
}
void bar11()
{
SB s1, s2;
s1 = s2; // ERROR
bar10(s1);
s2 = bar9(); // ERROR
}

View File

@ -53,8 +53,12 @@ ERROR: 0:104: 'gl_FragDepthEXT' : required extension not requested: GL_EXT_frag_
ERROR: 0:111: 'gl_FragDepth' : undeclared identifier ERROR: 0:111: 'gl_FragDepth' : undeclared identifier
ERROR: 0:134: 'texture3D' : no matching overloaded function found ERROR: 0:134: 'texture3D' : no matching overloaded function found
ERROR: 0:135: 'texture2DProjLod' : no matching overloaded function found ERROR: 0:135: 'texture2DProjLod' : no matching overloaded function found
ERROR: 0:140: '' : syntax error ERROR: 0:137: 'bitwise not' : not supported for this version or the enabled extensions
ERROR: 49 compilation errors. No code generated. ERROR: 0:138: 'bitwise inclusive or' : not supported for this version or the enabled extensions
ERROR: 0:139: 'bitwise and' : not supported for this version or the enabled extensions
ERROR: 0:144: 'a' : redefinition
ERROR: 0:149: '' : syntax error
ERROR: 53 compilation errors. No code generated.
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
0:3 Sequence 0:3 Sequence
@ -226,6 +230,21 @@ ERROR: node is still EOpNull!
0:134 0.000000 0:134 0.000000
0:135 Constant: 0:135 Constant:
0:135 0.000000 0:135 0.000000
0:137 Bitwise not (mediump int)
0:137 'a' (mediump int)
0:138 inclusive-or (mediump int)
0:138 'a' (mediump int)
0:138 'a' (mediump int)
0:139 bitwise and (mediump int)
0:139 'a' (mediump int)
0:139 'a' (mediump int)
0:144 Function Definition: foo203940(i1;f1;f1; (mediump int)
0:144 Function Parameters:
0:144 'a' (in mediump int)
0:144 'b' (in mediump float)
0:146 Sequence
0:146 Branch: Return with expression
0:146 'a' (in mediump int)
0:? Linker Objects 0:? Linker Objects
0:? 'a' (3-element array of mediump int) 0:? 'a' (3-element array of mediump int)
0:? 'uint' (mediump int) 0:? 'uint' (mediump int)

View File

@ -2,6 +2,7 @@ ERROR: 0:3: 'float' : type requires declaration of default precision qualifier
ERROR: 0:3: '' : array size required ERROR: 0:3: '' : array size required
ERROR: 0:9: 'arrayed type' : not supported for this version or the enabled extensions ERROR: 0:9: 'arrayed type' : not supported for this version or the enabled extensions
ERROR: 0:9: 'arrayed type' : not supported for this version or the enabled extensions ERROR: 0:9: 'arrayed type' : not supported for this version or the enabled extensions
ERROR: 0:9: 'array in function return type' : not supported for this version or the enabled extensions
ERROR: 0:11: 'arrayed constructor' : not supported for this version or the enabled extensions ERROR: 0:11: 'arrayed constructor' : not supported for this version or the enabled extensions
ERROR: 0:21: '[' : array index out of range '2' ERROR: 0:21: '[' : array index out of range '2'
ERROR: 0:24: 'array assignment' : not supported for this version or the enabled extensions ERROR: 0:24: 'array assignment' : not supported for this version or the enabled extensions
@ -15,7 +16,10 @@ ERROR: 0:31: 'array comparison' : not supported for this version or the enabled
ERROR: 0:35: '[' : array index out of range '5' ERROR: 0:35: '[' : array index out of range '5'
ERROR: 0:38: '[' : array index out of range '1000' ERROR: 0:38: '[' : array index out of range '1000'
ERROR: 0:39: '[' : index out of range '-1' ERROR: 0:39: '[' : index out of range '-1'
ERROR: 17 compilation errors. No code generated. ERROR: 0:53: 'array in function return type' : not supported for this version or the enabled extensions
ERROR: 0:66: 'array assignment' : not supported for this version or the enabled extensions
ERROR: 0:68: 'array assignment' : not supported for this version or the enabled extensions
ERROR: 21 compilation errors. No code generated.
ERROR: node is still EOpNull! ERROR: node is still EOpNull!
0:9 Function Definition: foo(f1[5]; (4-element array of mediump float) 0:9 Function Definition: foo(f1[5]; (4-element array of mediump float)
@ -120,6 +124,25 @@ ERROR: node is still EOpNull!
0:40 1.000000 0:40 1.000000
0:40 1.000000 0:40 1.000000
0:40 1.000000 0:40 1.000000
0:53 Function Definition: bar9( (structure{v4,sa})
0:53 Function Parameters:
0:? Sequence
0:56 Branch: Return with expression
0:56 's' (structure{v4,sa})
0:59 Function Definition: bar10(struct-SB-vf4-struct-SA-vf3-vf2[4]11; (void)
0:59 Function Parameters:
0:59 's' (in structure{v4,sa})
0:63 Function Definition: bar11( (void)
0:63 Function Parameters:
0:? Sequence
0:66 move second child to first child (structure{v4,sa})
0:66 's1' (structure{v4,sa})
0:66 's2' (structure{v4,sa})
0:67 Function Call: bar10(struct-SB-vf4-struct-SA-vf3-vf2[4]11; (void)
0:67 's1' (structure{v4,sa})
0:68 move second child to first child (structure{v4,sa})
0:68 's2' (structure{v4,sa})
0:68 Function Call: bar9( (structure{v4,sa})
0:? Linker Objects 0:? Linker Objects
0:? 'gu' (unsized array of mediump float) 0:? 'gu' (unsized array of mediump float)
0:? 'g4' (4-element array of mediump float) 0:? 'g4' (4-element array of mediump float)

View File

@ -216,6 +216,18 @@ ERROR: node is still EOpNull!
0:113 0.000000 0:113 0.000000
0:114 Constant: 0:114 Constant:
0:114 0.000000 0:114 0.000000
0:116 move second child to first child (int)
0:116 'p' (int)
0:116 Constant:
0:116 2147483647 (const int)
0:117 move second child to first child (int)
0:117 'p' (int)
0:117 Constant:
0:117 -2147483648 (const int)
0:118 move second child to first child (int)
0:118 'p' (int)
0:118 Constant:
0:118 -2147483647 (const int)
0:? Linker Objects 0:? Linker Objects
0:? 'a' (const int) 0:? 'a' (const int)
0:? 1 (const int) 0:? 1 (const int)

View File

@ -112,4 +112,8 @@ void foo2()
m2[-1][1]; // ERROR m2[-1][1]; // ERROR
m3[1][3]; // ERROR m3[1][3]; // ERROR
m3[3][1]; // ERROR m3[3][1]; // ERROR
} int p;
p = -2147483647 / -1;
p = -2147483648 / -1;
p = 2147483647 / -1;
}

View File

@ -165,9 +165,11 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, TIntermTyped* constantNod
break; break;
case EbtInt: case EbtInt:
if (rightUnionArray[i] == 0) { if (rightUnionArray[i] == 0)
newConstArray[i].setIConst(0x7FFFFFFF); newConstArray[i].setIConst(0x7FFFFFFF);
} else else if (rightUnionArray[i].getIConst() == -1 && unionArray[i].getIConst() == 0x80000000)
newConstArray[i].setIConst(0x80000000);
else
newConstArray[i].setIConst(unionArray[i].getIConst() / rightUnionArray[i].getIConst()); newConstArray[i].setIConst(unionArray[i].getIConst() / rightUnionArray[i].getIConst());
break; break;

View File

@ -758,6 +758,8 @@ TFunction* TParseContext::handleFunctionDeclarator(TSourceLoc loc, TFunction& fu
} }
} }
arrayObjectCheck(loc, function.getType(), "array in function return type");
// All built-in functions are defined, even though they don't have a body. // All built-in functions are defined, even though they don't have a body.
if (symbolTable.atBuiltInLevel()) if (symbolTable.atBuiltInLevel())
function.setDefined(); function.setDefined();
@ -831,26 +833,22 @@ TIntermAggregate* TParseContext::handleFunctionDefinition(TSourceLoc loc, TFunct
TParameter& param = function[i]; TParameter& param = function[i];
if (param.name != 0) { if (param.name != 0) {
TVariable *variable = new TVariable(param.name, *param.type); TVariable *variable = new TVariable(param.name, *param.type);
//
// Insert the parameters with name in the symbol table. // Insert the parameters with name in the symbol table.
//
if (! symbolTable.insert(*variable)) { if (! symbolTable.insert(*variable)) {
error(loc, "redefinition", variable->getName().c_str(), ""); error(loc, "redefinition", variable->getName().c_str(), "");
delete variable; delete variable;
} } else {
// // Transfer ownership of name pointer to symbol table.
// Transfer ownership of name pointer to symbol table. param.name = 0;
//
param.name = 0;
// // Add the parameter to the HIL
// Add the parameter to the HIL paramNodes = intermediate.growAggregate(paramNodes,
// intermediate.addSymbol(variable->getUniqueId(),
paramNodes = intermediate.growAggregate(paramNodes, variable->getName(),
intermediate.addSymbol(variable->getUniqueId(), variable->getType(), loc),
variable->getName(), loc);
variable->getType(), loc), }
loc);
} else } else
paramNodes = intermediate.growAggregate(paramNodes, intermediate.addSymbol(0, "", *param.type, loc), loc); paramNodes = intermediate.growAggregate(paramNodes, intermediate.addSymbol(0, "", *param.type, loc), loc);
} }

View File

@ -441,7 +441,8 @@ unary_operator
: PLUS { $$.loc = $1.loc; $$.op = EOpNull; } : PLUS { $$.loc = $1.loc; $$.op = EOpNull; }
| DASH { $$.loc = $1.loc; $$.op = EOpNegative; } | DASH { $$.loc = $1.loc; $$.op = EOpNegative; }
| BANG { $$.loc = $1.loc; $$.op = EOpLogicalNot; } | BANG { $$.loc = $1.loc; $$.op = EOpLogicalNot; }
| TILDE { $$.loc = $1.loc; $$.op = EOpBitwiseNot; } | TILDE { $$.loc = $1.loc; $$.op = EOpBitwiseNot;
parseContext.fullIntegerCheck($1.loc, "bitwise not"); }
; ;
// Grammar Note: No '*' or '&' unary ops. Pointers are not supported. // Grammar Note: No '*' or '&' unary ops. Pointers are not supported.