]> granicus.if.org Git - clang/commitdiff
simplify code now that isConstantExpr really does always
authorChris Lattner <sabre@nondot.org>
Tue, 11 Dec 2007 23:15:04 +0000 (23:15 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 11 Dec 2007 23:15:04 +0000 (23:15 +0000)
return a loc.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44890 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaDecl.cpp

index 8a67bbe1f43968aecc05b7c2ad2cc350fdc8dff0..193abc40ace047f942f861f97de50bd20a1f3fd0 100644 (file)
@@ -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;