1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License.
5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software
10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and
13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License.
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
15cc863da574ed5079b055574127fe5788a9a0fc33Nicolas Capens#include "ParseHelper.h"
16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Use this class to carry along data from node to node in
19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// the traversal
20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanclass TConstTraverser : public TIntermTraverser {
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanpublic:
23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TConstTraverser(ConstantUnion* cUnion, bool singleConstParam, TOperator constructType, TInfoSink& sink, TType& t)
24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		: error(false),
25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  index(0),
26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  unionArray(cUnion),
27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  type(t),
28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  constructorType(constructType),
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  singleConstantParam(singleConstParam),
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  infoSink(sink),
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  size(0),
32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  isMatrix(false),
33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		  matrixSize(0) {
34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool error;
37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanprotected:
39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void visitSymbol(TIntermSymbol*);
40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void visitConstantUnion(TIntermConstantUnion*);
41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool visitBinary(Visit visit, TIntermBinary*);
42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool visitUnary(Visit visit, TIntermUnary*);
43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool visitSelection(Visit visit, TIntermSelection*);
44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool visitAggregate(Visit visit, TIntermAggregate*);
45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool visitLoop(Visit visit, TIntermLoop*);
46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool visitBranch(Visit visit, TIntermBranch*);
47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	size_t index;
49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	ConstantUnion *unionArray;
50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TType type;
51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TOperator constructorType;
52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool singleConstantParam;
53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TInfoSink& infoSink;
54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	size_t size; // size of the constructor ( 4 for vec4)
55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool isMatrix;
56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	int matrixSize; // dimension of the matrix (nominal size and not the instance size)
57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman};
58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The rest of the file are the traversal functions.  The last one
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// is the one that starts the traversal.
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Return true from interior nodes to have the external traversal
64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// continue on to children.  If you process children yourself,
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// return false.
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid TConstTraverser::visitSymbol(TIntermSymbol* node)
69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	infoSink.info.message(EPrefixInternalError, "Symbol Node found in constant constructor", node->getLine());
71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	return;
72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitBinary(Visit visit, TIntermBinary* node)
75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TQualifier qualifier = node->getType().getQualifier();
77c3bfb403361ae6dc1174cb6d379d2cc599663c76Nicolas Capens
78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (qualifier != EvqConstExpr) {
79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TString buf;
80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		buf.append("'constructor' : assigning non-constant to ");
81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		buf.append(type.getCompleteString());
82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		error = true;
84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return false;
85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	infoSink.info.message(EPrefixInternalError, "Binary Node found in constant constructor", node->getLine());
88c3bfb403361ae6dc1174cb6d379d2cc599663c76Nicolas Capens
89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	return false;
90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitUnary(Visit visit, TIntermUnary* node)
93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TString buf;
95d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	buf.append("'constructor' : assigning non-constant to ");
96d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	buf.append(type.getCompleteString());
97d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
98d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	error = true;
99d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	return false;
100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
102894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitAggregate(Visit visit, TIntermAggregate* node)
103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
104d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (!node->isConstructor() && node->getOp() != EOpComma) {
105d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		TString buf;
106d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		buf.append("'constructor' : assigning non-constant to ");
107d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		buf.append(type.getCompleteString());
108d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		infoSink.info.message(EPrefixError, buf.c_str(), node->getLine());
109d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		error = true;
110d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return false;
111d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
112d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
113d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (node->getSequence().size() == 0) {
114d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		error = true;
115d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return false;
116d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
117d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
118d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool flag = node->getSequence().size() == 1 && node->getSequence()[0]->getAsTyped()->getAsConstantUnion();
119d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (flag)
120d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
121d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		singleConstantParam = true;
122d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		constructorType = node->getOp();
123d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		size = node->getType().getObjectSize();
124d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
125d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if (node->getType().isMatrix()) {
126d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			isMatrix = true;
127d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			matrixSize = node->getType().getNominalSize();
128d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
129d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
130d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
131d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	for (TIntermSequence::iterator p = node->getSequence().begin();
132d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	                               p != node->getSequence().end(); p++) {
133d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
134d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if (node->getOp() == EOpComma)
135d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			index = 0;
136d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
137d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		(*p)->traverse(this);
138d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
139d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (flag)
140d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
141d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		singleConstantParam = false;
142d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		constructorType = EOpNull;
143d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		size = 0;
144d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		isMatrix = false;
145d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		matrixSize = 0;
146d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
147d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	return false;
148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitSelection(Visit visit, TIntermSelection* node)
151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
152d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	infoSink.info.message(EPrefixInternalError, "Selection Node found in constant constructor", node->getLine());
153d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	error = true;
154d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	return false;
155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid TConstTraverser::visitConstantUnion(TIntermConstantUnion* node)
158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
159d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (!node->getUnionArrayPointer())
160d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
161d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		// The constant was not initialized, this should already have been logged
162d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		assert(infoSink.info.size() != 0);
163d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return;
164d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
165d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
166d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	ConstantUnion* leftUnionArray = unionArray;
167d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	size_t instanceSize = type.getObjectSize();
168d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TBasicType basicType = type.getBasicType();
169d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
170d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (index >= instanceSize)
171d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return;
172d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
173d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (!singleConstantParam) {
174d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		size_t size = node->getType().getObjectSize();
175d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
176d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ConstantUnion *rightUnionArray = node->getUnionArrayPointer();
177d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		for(size_t i = 0; i < size; i++) {
178d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			if (index >= instanceSize)
179d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				return;
180d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			leftUnionArray[index].cast(basicType, rightUnionArray[i]);
181d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
182d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			(index)++;
183d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
184d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	} else {
185d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		size_t totalSize = index + size;
186d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ConstantUnion *rightUnionArray = node->getUnionArrayPointer();
187d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		if (!isMatrix) {
188d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int count = 0;
189d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(size_t i = index; i < totalSize; i++) {
190d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if (i >= instanceSize)
191d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					return;
192d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
193d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				leftUnionArray[i].cast(basicType, rightUnionArray[count]);
194d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
195d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				(index)++;
196d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
197d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if (node->getType().getObjectSize() > 1)
198d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					count++;
199d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
200d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		} else {  // for matrix constructors
201d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int count = 0;
202d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			int element = index;
203d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			for(size_t i = index; i < totalSize; i++) {
204d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if (i >= instanceSize)
205d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					return;
206d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if (element - i == 0 || (i - element) % (matrixSize + 1) == 0 )
207d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					leftUnionArray[i].cast(basicType, rightUnionArray[0]);
208d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				else
209d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					leftUnionArray[i].setFConst(0.0f);
210d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
211d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				(index)++;
212d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
213d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens				if (node->getType().getObjectSize() > 1)
214d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens					count++;
215d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens			}
216d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		}
217d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	}
218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitLoop(Visit visit, TIntermLoop* node)
221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
222d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	infoSink.info.message(EPrefixInternalError, "Loop Node found in constant constructor", node->getLine());
223d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	error = true;
224d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	return false;
225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanbool TConstTraverser::visitBranch(Visit visit, TIntermBranch* node)
228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
229d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	infoSink.info.message(EPrefixInternalError, "Branch Node found in constant constructor", node->getLine());
230d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	error = true;
231d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	return false;
232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This function is the one to call externally to start the traversal.
236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Individual functions can be initialized to 0 to skip processing of that
237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// type of node.  It's children will still be processed.
238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
239253fdd10c2c3b428302755db0df4ca6fbb60024fAlexis Hetubool TIntermediate::parseConstTree(const TSourceLoc& line, TIntermNode* root, ConstantUnion* unionArray, TOperator constructorType, TType t, bool singleConstantParam)
240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman{
241d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (root == 0)
242d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return false;
243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
244d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	TConstTraverser it(unionArray, singleConstantParam, constructorType, infoSink, t);
245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
246d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	root->traverse(&it);
247d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if (it.error)
248d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return true;
249d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	else
250d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		return false;
251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
252