From: Steve Naroff Date: Tue, 4 Sep 2007 14:36:54 +0000 (+0000) Subject: Make sure initializer type promotions get propagated. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9e8925e72f53a9e2c4633b6b48e965ed01702fe4;p=clang Make sure initializer type promotions get propagated. This fixes a recent regression with Codegen/mandel.c. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41696 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/Sema.h b/Sema/Sema.h index 95b89002ed..b7500f8688 100644 --- a/Sema/Sema.h +++ b/Sema/Sema.h @@ -442,10 +442,11 @@ private: IdentifierInfo &Comp, SourceLocation CmpLoc); /// type checking declaration initializers (C99 6.7.8) - bool CheckInitializer(Expr *simpleInit_or_initList, QualType &declType, + bool CheckInitializer(Expr *&simpleInit_or_initList, QualType &declType, bool isStatic); - bool CheckSingleInitializer(Expr *simpleInit, QualType declType); - bool CheckInitExpr(Expr *expr, bool isStatic, QualType ElementType); + bool CheckSingleInitializer(Expr *&simpleInit, QualType declType); + bool CheckInitExpr(Expr *expr, InitListExpr *IList, unsigned slot, + bool isStatic, QualType ElementType); void CheckVariableInitList(QualType DeclType, InitListExpr *IList, QualType ElementType, bool isStatic, int &nInitializers, bool &hadError); diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index a1ef816b01..b178e099ba 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -239,7 +239,7 @@ Sema::DeclTy *Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) { return 0; } -bool Sema::CheckSingleInitializer(Expr *Init, QualType DeclType) { +bool Sema::CheckSingleInitializer(Expr *&Init, QualType DeclType) { AssignmentCheckResult result; SourceLocation loc = Init->getLocStart(); // Get the type before calling CheckSingleAssignmentConstraints(), since @@ -289,8 +289,10 @@ bool Sema::CheckSingleInitializer(Expr *Init, QualType DeclType) { return false; } -bool Sema::CheckInitExpr(Expr *expr, bool isStatic, QualType ElementType) { +bool Sema::CheckInitExpr(Expr *expr, InitListExpr *IList, unsigned slot, + bool isStatic, QualType ElementType) { SourceLocation loc; + Expr *savExpr = expr; // Might be promoted by CheckSingleInitializer. if (isStatic && !expr->isConstantExpr(Context, &loc)) { // C99 6.7.8p4. Diag(loc, diag::err_init_element_not_constant, expr->getSourceRange()); @@ -298,6 +300,8 @@ bool Sema::CheckInitExpr(Expr *expr, bool isStatic, QualType ElementType) { } else if (CheckSingleInitializer(expr, ElementType)) { return true; // types weren't compatible. } + if (savExpr != expr) // The type was promoted, update initializer list. + IList->setInit(slot, expr); return false; } @@ -322,7 +326,7 @@ void Sema::CheckVariableInitList(QualType DeclType, InitListExpr *IList, maxElements, hadError); } } else { - hadError = CheckInitExpr(expr, isStatic, ElementType); + hadError = CheckInitExpr(expr, IList, i, isStatic, ElementType); } nInitializers++; } @@ -366,7 +370,7 @@ void Sema::CheckConstantInitList(QualType DeclType, InitListExpr *IList, CheckConstantInitList(DeclType, InitList, ElementType, isStatic, totalInits, hadError); } else { - hadError = CheckInitExpr(expr, isStatic, ElementType); + hadError = CheckInitExpr(expr, IList, i, isStatic, ElementType); nInitsAtLevel++; // increment the number of initializers at this level. totalInits--; // decrement the total number of initializers. @@ -388,7 +392,7 @@ void Sema::CheckConstantInitList(QualType DeclType, InitListExpr *IList, return; } -bool Sema::CheckInitializer(Expr *Init, QualType &DeclType, bool isStatic) { +bool Sema::CheckInitializer(Expr *&Init, QualType &DeclType, bool isStatic) { InitListExpr *InitList = dyn_cast(Init); if (!InitList) return CheckSingleInitializer(Init, DeclType); diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 037fecb64c..c5e0a6d272 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -991,6 +991,11 @@ public: return InitExprs[Init]; } + void setInit(unsigned Init, Expr *expr) { + assert(Init < NumInits && "Initializer access out of range!"); + InitExprs[Init] = expr; + } + virtual SourceRange getSourceRange() const { return SourceRange(LBraceLoc, RBraceLoc); }