]> granicus.if.org Git - clang/commitdiff
Add errors for some illegal constructs (specifically, "int a = {{3}};"
authorEli Friedman <eli.friedman@gmail.com>
Mon, 19 May 2008 20:12:18 +0000 (20:12 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Mon, 19 May 2008 20:12:18 +0000 (20:12 +0000)
and "int a = {};").  I'll adjust the tests in a bit.

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

include/clang/Basic/DiagnosticKinds.def
lib/Sema/SemaInit.cpp

index dc215539381023ad7ef2508c993ab4e2067d6437..b5fb1ddf6bf626474fd444193083c8812f48548a 100644 (file)
@@ -745,6 +745,10 @@ DIAG(warn_initializer_string_for_char_array_too_long, WARNING,
     "initializer-string for char array is too long")
 DIAG(warn_braces_around_scalar_init, WARNING,
      "braces around scalar initializer")
+DIAG(err_many_braces_around_scalar_init, ERROR,
+     "too many braces around scalar initializer")
+DIAG(err_empty_scalar_initializer, ERROR,
+     "scalar initializer cannot be empty")
 DIAG(err_illegal_initializer, ERROR,
      "illegal initializer (only variables can be initialized)")
 
index fb5329cfbb0aea1dae35da707f4b419b4638e8dd..94ddd0428dc631c39e017687fdc7b4f888ba83c0 100644 (file)
@@ -109,7 +109,7 @@ void InitListChecker::CheckExplicitInitList(InitListExpr *IList, QualType &T,
     // We have leftover initializers
     if (IList->getNumInits() > 0 &&
         SemaRef->IsStringLiteralInit(IList->getInit(Index), T)) {
-      // Special-case; this could be confusing
+      // Special-case
       SemaRef->Diag(IList->getInit(Index)->getLocStart(),
                     diag::err_excess_initializers_in_char_array_initializer,
                     IList->getInit(Index)->getSourceRange());
@@ -173,17 +173,27 @@ void InitListChecker::CheckScalarType(InitListExpr *IList, QualType &DeclType,
   if (Index < IList->getNumInits()) {
     Expr* expr = IList->getInit(Index);
     if (isa<InitListExpr>(expr)) {
-      // FIXME: Print error about too many braces
+      SemaRef->Diag(IList->getLocStart(),
+                    diag::err_many_braces_around_scalar_init, 
+                    IList->getSourceRange());
+      hadError = true;
+      ++Index;
+      return;
     }
     Expr *savExpr = expr; // Might be promoted by CheckSingleInitializer.
     if (SemaRef->CheckSingleInitializer(expr, DeclType))
-      hadError |= true; // types weren't compatible.
+      hadError = true; // types weren't compatible.
     else if (savExpr != expr)
       // The type was promoted, update initializer list.
       IList->setInit(Index, expr);
     ++Index;
+  } else {
+    SemaRef->Diag(IList->getLocStart(),
+                  diag::err_empty_scalar_initializer, 
+                  IList->getSourceRange());
+    hadError = true;
+    return;
   }
-  // FIXME: Should an error be reported for empty initializer list + scalar?
 }
 
 void InitListChecker::CheckVectorType(InitListExpr *IList, QualType DeclType, 
@@ -210,12 +220,6 @@ void InitListChecker::CheckArrayType(InitListExpr *IList, QualType &DeclType,
         SemaRef->IsStringLiteralInit(IList->getInit(Index), DeclType)) {
       SemaRef->CheckStringLiteralInit(lit, DeclType);
       ++Index;
-#if 0
-      if (IList->isExplicit() && Index < IList->getNumInits()) {
-        // We have leftover initializers; warn
-
-      }
-#endif
       return;
     }
   }