Fix unary operator return type.
Change-Id: I68322e6626953023c3af97325f085bc33ff1b7c6
Reviewed-on: https://swiftshader-review.googlesource.com/5080
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp
index eb33972..5f84222 100644
--- a/src/OpenGL/compiler/Intermediate.cpp
+++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -332,11 +332,8 @@
//
// Returns the added node.
//
-TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermNode* childNode, const TSourceLoc &line)
+TIntermTyped* TIntermediate::addUnaryMath(TOperator op, TIntermTyped* child, const TSourceLoc &line, const TType *funcReturnType)
{
- TIntermUnary* node;
- TIntermTyped* child = childNode->getAsTyped();
-
if (child == 0) {
infoSink.info.message(EPrefixInternalError, "Bad type in AddUnaryMath", line);
return 0;
@@ -372,11 +369,11 @@
//
// Make a new node for the operator.
//
- node = new TIntermUnary(op);
+ TIntermUnary *node = new TIntermUnary(op);
node->setLine(line);
node->setOperand(child);
- if (! node->promote(infoSink))
+ if (! node->promote(infoSink, funcReturnType))
return 0;
if (childTempConstant) {
@@ -728,8 +725,16 @@
//
// Returns false in nothing makes sense.
//
-bool TIntermUnary::promote(TInfoSink&)
+bool TIntermUnary::promote(TInfoSink&, const TType *funcReturnType)
{
+ setType(funcReturnType ? *funcReturnType : operand->getType());
+
+ // Unary operations result in temporary variables unless const.
+ if(type.getQualifier() != EvqConstExpr)
+ {
+ type.setQualifier(EvqTemporary);
+ }
+
switch (op) {
case EOpLogicalNot:
if (operand->getBasicType() != EbtBool)
@@ -773,13 +778,6 @@
return false;
}
- setType(operand->getType());
-
- // Unary operations results in temporary variables unless const.
- if (operand->getQualifier() != EvqConstExpr) {
- getTypePointer()->setQualifier(EvqTemporary);
- }
-
return true;
}
diff --git a/src/OpenGL/compiler/ParseHelper.cpp b/src/OpenGL/compiler/ParseHelper.cpp
index 821ea9c..499ec13 100644
--- a/src/OpenGL/compiler/ParseHelper.cpp
+++ b/src/OpenGL/compiler/ParseHelper.cpp
@@ -3086,7 +3086,7 @@
break;
}
- return intermediate.addUnaryMath(op, child, loc); // FIXME , funcReturnType);
+ return intermediate.addUnaryMath(op, child, loc, funcReturnType);
}
TIntermTyped *TParseContext::addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc)
diff --git a/src/OpenGL/compiler/intermediate.h b/src/OpenGL/compiler/intermediate.h
index 9e97c25..7d7007a 100644
--- a/src/OpenGL/compiler/intermediate.h
+++ b/src/OpenGL/compiler/intermediate.h
@@ -513,7 +513,7 @@
void setOperand(TIntermTyped* o) { operand = o; }
TIntermTyped* getOperand() { return operand; }
- bool promote(TInfoSink&);
+ bool promote(TInfoSink&, const TType *funcReturnType);
protected:
TIntermTyped* operand;
diff --git a/src/OpenGL/compiler/localintermediate.h b/src/OpenGL/compiler/localintermediate.h
index e9831a4..4d6ed79 100644
--- a/src/OpenGL/compiler/localintermediate.h
+++ b/src/OpenGL/compiler/localintermediate.h
@@ -27,7 +27,7 @@
TIntermTyped* addBinaryMath(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);
TIntermTyped* addAssign(TOperator op, TIntermTyped* left, TIntermTyped* right, const TSourceLoc&);
TIntermTyped* addIndex(TOperator op, TIntermTyped* base, TIntermTyped* index, const TSourceLoc&);
- TIntermTyped* addUnaryMath(TOperator op, TIntermNode* child, const TSourceLoc&);
+ TIntermTyped* addUnaryMath(TOperator op, TIntermTyped* child, const TSourceLoc&, const TType*);
TIntermAggregate* growAggregate(TIntermNode* left, TIntermNode* right, const TSourceLoc&);
TIntermAggregate* makeAggregate(TIntermNode* node, const TSourceLoc&);
TIntermAggregate* setAggregateOperator(TIntermNode*, TOperator, const TSourceLoc&);
@@ -45,7 +45,7 @@
TIntermTyped* addSwizzle(TVectorFields&, const TSourceLoc&);
bool postProcess(TIntermNode*);
void outputTree(TIntermNode*);
-
+
protected:
TInfoSink& infoSink;