From: Douglas Gregor Date: Thu, 29 Jan 2009 00:45:39 +0000 (+0000) Subject: Move InitListChecker out of Sema.h X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c34ee5ef2b267a683c432ba0c342f7c3a14889d6;p=clang Move InitListChecker out of Sema.h git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63258 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index ad21e7d271..f14aba6a4f 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -19,7 +19,6 @@ #include "CXXFieldCollector.h" #include "SemaOverload.h" #include "clang/AST/DeclBase.h" -#include "clang/AST/Expr.h" #include "clang/Parse/Action.h" #include "clang/Basic/DiagnosticSema.h" #include "llvm/ADT/SmallVector.h" @@ -28,7 +27,6 @@ #include "llvm/ADT/OwningPtr.h" #include #include -#include namespace llvm { class APSInt; @@ -1720,6 +1718,7 @@ public: bool CheckInitializerTypes(Expr *&simpleInit_or_initList, QualType &declType, SourceLocation InitLoc,DeclarationName InitEntity, bool DirectInit); + bool CheckInitList(InitListExpr *&InitList, QualType &DeclType); bool CheckSingleInitializer(Expr *&simpleInit, QualType declType, bool DirectInit); bool CheckForConstantInitializer(Expr *e, QualType t); @@ -1835,73 +1834,6 @@ private: void CheckFloatComparison(SourceLocation loc, Expr* lex, Expr* rex); }; -class InitListChecker { - Sema *SemaRef; - bool hadError; - std::map SyntacticToSemantic; - InitListExpr *FullyStructuredList; - - void CheckImplicitInitList(InitListExpr *ParentIList, QualType T, - unsigned &Index, InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - void CheckExplicitInitList(InitListExpr *IList, QualType &T, - unsigned &Index, InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - void CheckListElementTypes(InitListExpr *IList, QualType &DeclType, - bool SubobjectIsDesignatorContext, - unsigned &Index, - InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - void CheckSubElementType(InitListExpr *IList, QualType ElemType, - unsigned &Index, - InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - // FIXME: Does DeclType need to be a reference type? - void CheckScalarType(InitListExpr *IList, QualType &DeclType, - unsigned &Index, - InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - void CheckVectorType(InitListExpr *IList, QualType DeclType, unsigned &Index, - InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - void CheckStructUnionTypes(InitListExpr *IList, QualType DeclType, - RecordDecl::field_iterator Field, - bool SubobjectIsDesignatorContext, unsigned &Index, - InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - void CheckArrayType(InitListExpr *IList, QualType &DeclType, - llvm::APSInt elementIndex, - bool SubobjectIsDesignatorContext, unsigned &Index, - InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex); - bool CheckDesignatedInitializer(InitListExpr *IList, DesignatedInitExpr *DIE, - DesignatedInitExpr::designators_iterator D, - QualType &CurrentObjectType, - RecordDecl::field_iterator *NextField, - llvm::APSInt *NextElementIndex, - unsigned &Index, - InitListExpr *StructuredList, - unsigned &StructuredIndex, - bool FinishSubobjectInit = true); - InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, - QualType CurrentObjectType, - InitListExpr *StructuredList, - unsigned StructuredIndex, - SourceRange InitRange); - void UpdateStructuredListElement(InitListExpr *StructuredInitList, - unsigned &StructuredInitIndex, - Expr *expr); - int numArrayElements(QualType DeclType); - int numStructUnionElements(QualType DeclType); -public: - InitListChecker(Sema *S, InitListExpr *IL, QualType &T); - bool HadError() { return hadError; } - - // @brief Retrieves the fully-structured initializer list used for - // semantic analysis and code generation. - InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } -}; - /// BlockSemaInfo - When a block is being parsed, this contains information /// about the block. It is pointed to from Sema::CurBlock. struct BlockSemaInfo { diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 54f84cf40e..77f99e848f 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -1150,11 +1150,9 @@ bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType, } } - InitListChecker CheckInitList(this, InitList, DeclType); - if (!CheckInitList.HadError()) - Init = CheckInitList.getFullyStructuredList(); - - return CheckInitList.HadError(); + bool hadError = CheckInitList(InitList, DeclType); + Init = InitList; + return hadError; } /// GetNameForDeclarator - Determine the full declaration name for the diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index b78fc7b1e6..c2539913ce 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -17,8 +17,76 @@ #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" #include "clang/Basic/DiagnosticSema.h" +#include using namespace clang; +class InitListChecker { + Sema *SemaRef; + bool hadError; + std::map SyntacticToSemantic; + InitListExpr *FullyStructuredList; + + void CheckImplicitInitList(InitListExpr *ParentIList, QualType T, + unsigned &Index, InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + void CheckExplicitInitList(InitListExpr *IList, QualType &T, + unsigned &Index, InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + void CheckListElementTypes(InitListExpr *IList, QualType &DeclType, + bool SubobjectIsDesignatorContext, + unsigned &Index, + InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + void CheckSubElementType(InitListExpr *IList, QualType ElemType, + unsigned &Index, + InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + // FIXME: Does DeclType need to be a reference type? + void CheckScalarType(InitListExpr *IList, QualType &DeclType, + unsigned &Index, + InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + void CheckVectorType(InitListExpr *IList, QualType DeclType, unsigned &Index, + InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + void CheckStructUnionTypes(InitListExpr *IList, QualType DeclType, + RecordDecl::field_iterator Field, + bool SubobjectIsDesignatorContext, unsigned &Index, + InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + void CheckArrayType(InitListExpr *IList, QualType &DeclType, + llvm::APSInt elementIndex, + bool SubobjectIsDesignatorContext, unsigned &Index, + InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex); + bool CheckDesignatedInitializer(InitListExpr *IList, DesignatedInitExpr *DIE, + DesignatedInitExpr::designators_iterator D, + QualType &CurrentObjectType, + RecordDecl::field_iterator *NextField, + llvm::APSInt *NextElementIndex, + unsigned &Index, + InitListExpr *StructuredList, + unsigned &StructuredIndex, + bool FinishSubobjectInit = true); + InitListExpr *getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, + QualType CurrentObjectType, + InitListExpr *StructuredList, + unsigned StructuredIndex, + SourceRange InitRange); + void UpdateStructuredListElement(InitListExpr *StructuredInitList, + unsigned &StructuredInitIndex, + Expr *expr); + int numArrayElements(QualType DeclType); + int numStructUnionElements(QualType DeclType); +public: + InitListChecker(Sema *S, InitListExpr *IL, QualType &T); + bool HadError() { return hadError; } + + // @brief Retrieves the fully-structured initializer list used for + // semantic analysis and code generation. + InitListExpr *getFullyStructuredList() const { return FullyStructuredList; } +}; + /// Recursively replaces NULL values within the given initializer list /// with expressions that perform value-initialization of the /// appropriate type. @@ -1003,3 +1071,11 @@ Sema::OwningExprResult Sema::ActOnDesignatedInitializer(Designation &Desig, static_cast(Init.release())); return Owned(DIE); } + +bool Sema::CheckInitList(InitListExpr *&InitList, QualType &DeclType) { + InitListChecker CheckInitList(this, InitList, DeclType); + if (!CheckInitList.HadError()) + InitList = CheckInitList.getFullyStructuredList(); + + return CheckInitList.HadError(); +}