HLSL: Error if funcion with return type doesn't return a value.
This commit is contained in:
@@ -1496,20 +1496,16 @@ bool HlslGrammar::acceptParameterDeclaration(TFunction& function)
|
||||
// parsing the body (compound_statement).
|
||||
bool HlslGrammar::acceptFunctionDefinition(TFunction& function, TIntermNode*& node)
|
||||
{
|
||||
TFunction* functionDeclarator = parseContext.handleFunctionDeclarator(token.loc, function, false /* not prototype */);
|
||||
TFunction& functionDeclarator = parseContext.handleFunctionDeclarator(token.loc, function, false /* not prototype */);
|
||||
TSourceLoc loc = token.loc;
|
||||
|
||||
// This does a pushScope()
|
||||
node = parseContext.handleFunctionDefinition(loc, *functionDeclarator);
|
||||
node = parseContext.handleFunctionDefinition(loc, functionDeclarator);
|
||||
|
||||
// compound_statement
|
||||
TIntermNode* functionBody = nullptr;
|
||||
if (acceptCompoundStatement(functionBody)) {
|
||||
node = intermediate.growAggregate(node, functionBody);
|
||||
intermediate.setAggregateOperator(node, EOpFunction, functionDeclarator->getType(), loc);
|
||||
node->getAsAggregate()->setName(functionDeclarator->getMangledName().c_str());
|
||||
parseContext.popScope();
|
||||
|
||||
parseContext.handleFunctionBody(loc, functionDeclarator, functionBody, node);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -686,7 +686,7 @@ TIntermTyped* HlslParseContext::handleDotDereference(const TSourceLoc& loc, TInt
|
||||
// Handle seeing a function declarator in the grammar. This is the precursor
|
||||
// to recognizing a function prototype or function definition.
|
||||
//
|
||||
TFunction* HlslParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunction& function, bool prototype)
|
||||
TFunction& HlslParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFunction& function, bool prototype)
|
||||
{
|
||||
//
|
||||
// Multiple declarations of the same function name are allowed.
|
||||
@@ -720,7 +720,7 @@ TFunction* HlslParseContext::handleFunctionDeclarator(const TSourceLoc& loc, TFu
|
||||
// in which case, we need to use the parameter names from this one, and not the one that's
|
||||
// being redeclared. So, pass back this declaration, not the one in the symbol table.
|
||||
//
|
||||
return &function;
|
||||
return function;
|
||||
}
|
||||
|
||||
//
|
||||
@@ -798,6 +798,18 @@ TIntermAggregate* HlslParseContext::handleFunctionDefinition(const TSourceLoc& l
|
||||
return paramNodes;
|
||||
}
|
||||
|
||||
void HlslParseContext::handleFunctionBody(const TSourceLoc& loc, TFunction& function, TIntermNode* functionBody, TIntermNode*& node)
|
||||
{
|
||||
node = intermediate.growAggregate(node, functionBody);
|
||||
intermediate.setAggregateOperator(node, EOpFunction, function.getType(), loc);
|
||||
node->getAsAggregate()->setName(function.getMangledName().c_str());
|
||||
|
||||
popScope();
|
||||
|
||||
if (function.getType().getBasicType() != EbtVoid && ! functionReturnsValue)
|
||||
error(loc, "function does not return a value:", "", function.getName().c_str());
|
||||
}
|
||||
|
||||
// AST I/O is done through shader globals declared in the 'in' or 'out'
|
||||
// storage class. An HLSL entry point has a return value, input parameters
|
||||
// and output parameters. These need to get remapped to the AST I/O.
|
||||
@@ -839,6 +851,7 @@ void HlslParseContext::remapEntrypointIO(TFunction& function)
|
||||
// if necessary.
|
||||
TIntermNode* HlslParseContext::handleReturnValue(const TSourceLoc& loc, TIntermTyped* value)
|
||||
{
|
||||
functionReturnsValue = true;
|
||||
TIntermTyped* converted = value;
|
||||
|
||||
if (currentFunctionType->getBasicType() == EbtVoid) {
|
||||
|
||||
@@ -83,8 +83,9 @@ public:
|
||||
TIntermTyped* handleBinaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* left, TIntermTyped* right);
|
||||
TIntermTyped* handleUnaryMath(const TSourceLoc&, const char* str, TOperator op, TIntermTyped* childNode);
|
||||
TIntermTyped* handleDotDereference(const TSourceLoc&, TIntermTyped* base, const TString& field);
|
||||
TFunction* handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
||||
TFunction& handleFunctionDeclarator(const TSourceLoc&, TFunction& function, bool prototype);
|
||||
TIntermAggregate* handleFunctionDefinition(const TSourceLoc&, TFunction&);
|
||||
void handleFunctionBody(const TSourceLoc&, TFunction&, TIntermNode* functionBody, TIntermNode*& node);
|
||||
void remapEntrypointIO(TFunction& function);
|
||||
TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
|
||||
void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
|
||||
|
||||
Reference in New Issue
Block a user