Home | History | Annotate | Download | only in compiler
      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