From: Chris Lattner Date: Tue, 11 Dec 2007 23:15:04 +0000 (+0000) Subject: simplify code now that isConstantExpr really does always X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=33b7b0673ac0f2962cfb8ec3d057712bd403d7a7;p=clang simplify code now that isConstantExpr really does always return a loc. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44890 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index 8a67bbe1f4..193abc40ac 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -356,12 +356,12 @@ Sema::DeclTy *Sema::ParsedFreeStandingDeclSpec(Scope *S, DeclSpec &DS) { bool Sema::CheckSingleInitializer(Expr *&Init, bool isStatic, QualType DeclType) { - SourceLocation loc = Init->getLocStart(); - // FIXME: Remove the isReferenceType check and handle assignment // to a reference. + SourceLocation loc; if (isStatic && !DeclType->isReferenceType() && !Init->isConstantExpr(Context, &loc)) { // C99 6.7.8p4. + assert(loc.isValid() && "isConstantExpr didn't return a loc!"); Diag(loc, diag::err_init_element_not_constant, Init->getSourceRange()); return true; } @@ -382,27 +382,27 @@ bool Sema::CheckSingleInitializer(Expr *&Init, bool isStatic, // char s[] = "abc", which is identical to char s[] = { 'a', 'b', 'c' }; if (rhsType == Context.getPointerType(Context.CharTy)) break; - Diag(loc, diag::err_typecheck_assign_incompatible, + Diag(Init->getLocStart(), diag::err_typecheck_assign_incompatible, DeclType.getAsString(), rhsType.getAsString(), Init->getSourceRange()); return true; case PointerFromInt: - Diag(loc, diag::ext_typecheck_assign_pointer_int, + Diag(Init->getLocStart(), diag::ext_typecheck_assign_pointer_int, DeclType.getAsString(), rhsType.getAsString(), Init->getSourceRange()); break; case IntFromPointer: - Diag(loc, diag::ext_typecheck_assign_pointer_int, + Diag(Init->getLocStart(), diag::ext_typecheck_assign_pointer_int, DeclType.getAsString(), rhsType.getAsString(), Init->getSourceRange()); break; case IncompatiblePointer: - Diag(loc, diag::ext_typecheck_assign_incompatible_pointer, + Diag(Init->getLocStart(), diag::ext_typecheck_assign_incompatible_pointer, DeclType.getAsString(), rhsType.getAsString(), Init->getSourceRange()); break; case CompatiblePointerDiscardsQualifiers: - Diag(loc, diag::ext_typecheck_assign_discards_qualifiers, + Diag(Init->getLocStart(), diag::ext_typecheck_assign_discards_qualifiers, DeclType.getAsString(), rhsType.getAsString(), Init->getSourceRange()); break; @@ -413,14 +413,16 @@ bool Sema::CheckSingleInitializer(Expr *&Init, bool isStatic, 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. + assert(loc.isValid() && "isConstantExpr didn't return a loc!"); Diag(loc, diag::err_init_element_not_constant, expr->getSourceRange()); return true; - } else if (CheckSingleInitializer(expr, isStatic, ElementType)) { - return true; // types weren't compatible. } + + Expr *savExpr = expr; // Might be promoted by CheckSingleInitializer. + if (CheckSingleInitializer(expr, isStatic, ElementType)) + return true; // types weren't compatible. + if (savExpr != expr) // The type was promoted, update initializer list. IList->setInit(slot, expr); return false;