• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef COMPILER_TRANSLATOR_VALIDATESWITCH_H_
16 #define COMPILER_TRANSLATOR_VALIDATESWITCH_H_
17 
18 #include "intermediate.h"
19 #include <set>
20 
21 class TParseContext;
22 
23 class ValidateSwitch : public TIntermTraverser
24 {
25 public:
26 	// Check for errors and output messages any remaining errors on the context.
27 	// Returns true if there are no errors.
28 	static bool validate(TBasicType switchType, TParseContext *context,
29 	                     TIntermAggregate *statementList, const TSourceLoc &loc);
30 
31 	void visitSymbol(TIntermSymbol *) override;
32 	void visitConstantUnion(TIntermConstantUnion *) override;
33 	bool visitBinary(Visit, TIntermBinary *) override;
34 	bool visitUnary(Visit, TIntermUnary *) override;
35 	bool visitSelection(Visit visit, TIntermSelection *) override;
36 	bool visitSwitch(Visit, TIntermSwitch *) override;
37 	bool visitCase(Visit, TIntermCase *) override;
38 	bool visitAggregate(Visit, TIntermAggregate *) override;
39 	bool visitLoop(Visit visit, TIntermLoop *) override;
40 	bool visitBranch(Visit, TIntermBranch *) override;
41 
42 private:
43 	ValidateSwitch(TBasicType switchType, TParseContext *context);
44 
45 	bool validateInternal(const TSourceLoc &loc);
46 
47 	TBasicType mSwitchType;
48 	TParseContext *mContext;
49 	bool mCaseTypeMismatch;
50 	bool mFirstCaseFound;
51 	bool mStatementBeforeCase;
52 	bool mLastStatementWasCase;
53 	int mControlFlowDepth;
54 	bool mCaseInsideControlFlow;
55 	int mDefaultCount;
56 	std::set<int> mCasesSigned;
57 	std::set<unsigned int> mCasesUnsigned;
58 	bool mDuplicateCases;
59 };
60 
61 #endif // COMPILER_TRANSLATOR_VALIDATESWITCH_H_
62