Front-end: Add missing rule for function-return implicit type conversion check.

Basic (component) type conversion was done, but checking that the composite
was correct was not being done.

Fixes issue #353.
This commit is contained in:
John Kessenich 2016-06-28 23:56:31 -06:00
parent b10feabc95
commit bc17b0a96a
3 changed files with 23 additions and 2 deletions

View File

@ -1,8 +1,12 @@
functionSemantics.frag functionSemantics.frag
Warning, version 400 is not yet complete; most version-specific features are present, but some are missing. Warning, version 400 is not yet complete; most version-specific features are present, but some are missing.
ERROR: 0:74: 'return' : cannot convert return value to function return type
WARNING: 0:74: 'return' : type conversion on return values was not explicitly allowed until version 420
ERROR: 1 compilation errors. No code generated.
Shader version: 400 Shader version: 400
0:? Sequence ERROR: node is still EOpNull!
0:5 Function Definition: foo(i1;i1;i1;i1;i1;i1; (global int) 0:5 Function Definition: foo(i1;i1;i1;i1;i1;i1; (global int)
0:5 Function Parameters: 0:5 Function Parameters:
0:5 'a' (in int) 0:5 'a' (in int)
@ -195,6 +199,11 @@ Shader version: 400
0:69 Construct ivec2 (temp 2-component vector of int) 0:69 Construct ivec2 (temp 2-component vector of int)
0:69 Convert float to int (temp int) 0:69 Convert float to int (temp int)
0:69 'F' (temp float) 0:69 'F' (temp float)
0:72 Function Definition: badConv( (global 4-component vector of float)
0:72 Function Parameters:
0:74 Sequence
0:74 Branch: Return with expression
0:74 'u' (uniform float)
0:? Linker Objects 0:? Linker Objects
0:? 'u' (uniform float) 0:? 'u' (uniform float)
@ -203,7 +212,7 @@ Linked fragment stage:
Shader version: 400 Shader version: 400
0:? Sequence ERROR: node is still EOpNull!
0:5 Function Definition: foo(i1;i1;i1;i1;i1;i1; (global int) 0:5 Function Definition: foo(i1;i1;i1;i1;i1;i1; (global int)
0:5 Function Parameters: 0:5 Function Parameters:
0:5 'a' (in int) 0:5 'a' (in int)
@ -396,6 +405,11 @@ Shader version: 400
0:69 Construct ivec2 (temp 2-component vector of int) 0:69 Construct ivec2 (temp 2-component vector of int)
0:69 Convert float to int (temp int) 0:69 Convert float to int (temp int)
0:69 'F' (temp float) 0:69 'F' (temp float)
0:72 Function Definition: badConv( (global 4-component vector of float)
0:72 Function Parameters:
0:74 Sequence
0:74 Branch: Return with expression
0:74 'u' (uniform float)
0:? Linker Objects 0:? Linker Objects
0:? 'u' (uniform float) 0:? 'u' (uniform float)

View File

@ -68,3 +68,8 @@ void aggCall()
float F; float F;
m(ivec2(F)); // test input conversion of single argument that's an aggregate; other function tests in 120.vert m(ivec2(F)); // test input conversion of single argument that's an aggregate; other function tests in 120.vert
} }
vec4 badConv()
{
return u; // ERROR, can change scalar to vector
}

View File

@ -1208,6 +1208,8 @@ TIntermNode* TParseContext::handleReturnValue(const TSourceLoc& loc, TIntermType
} else if (*currentFunctionType != value->getType()) { } else if (*currentFunctionType != value->getType()) {
TIntermTyped* converted = intermediate.addConversion(EOpReturn, *currentFunctionType, value); TIntermTyped* converted = intermediate.addConversion(EOpReturn, *currentFunctionType, value);
if (converted) { if (converted) {
if (*currentFunctionType != converted->getType())
error(loc, "cannot convert return value to function return type", "return", "");
if (version < 420) if (version < 420)
warn(loc, "type conversion on return values was not explicitly allowed until version 420", "return", ""); warn(loc, "type conversion on return values was not explicitly allowed until version 420", "return", "");
return intermediate.addBranch(EOpReturn, converted, loc); return intermediate.addBranch(EOpReturn, converted, loc);