]> granicus.if.org Git - clang/commitdiff
[Sema] Don't assume that an initializer list has an initializer
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 10 Apr 2015 04:52:06 +0000 (04:52 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 10 Apr 2015 04:52:06 +0000 (04:52 +0000)
Given something like 'int({}, 1)', we would try to emit a diagnostic
regarding the excess element in the scalar initializer.  However, we
assumed that the initializer list had an element in it.

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

lib/Sema/SemaInit.cpp
test/SemaCXX/functional-cast.cpp

index 4a6531e5069ed77ad2ffe4380cba4a73893ab420..7392b671e0d7e6d073a737502abd9865334e93c8 100644 (file)
@@ -6753,9 +6753,9 @@ bool InitializationSequence::Diagnose(Sema &S,
   case FK_TooManyInitsForScalar: {
     SourceRange R;
 
-    if (InitListExpr *InitList = dyn_cast<InitListExpr>(Args[0]))
-      R = SourceRange(InitList->getInit(0)->getLocEnd(),
-                      InitList->getLocEnd());
+    auto *InitList = dyn_cast<InitListExpr>(Args[0]);
+    if (InitList && InitList->getNumInits() == 1)
+      R = SourceRange(InitList->getInit(0)->getLocEnd(), InitList->getLocEnd());
     else
       R = SourceRange(Args.front()->getLocEnd(), Args.back()->getLocEnd());
 
index f5ca76c38c065465c3424714b077f93bcfd508ef..9db95e80d03ed7125ae2a4a5c740d8f4c025479a 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
 // REQUIRES: LP64
 
 // ------------ not interpreted as C-style cast ------------
@@ -11,7 +11,7 @@ struct InitViaConstructor {
   InitViaConstructor(int i = 7);
 };
 
-struct NoValueInit { // expected-note 2 {{candidate constructor (the implicit copy constructor)}} 
+struct NoValueInit { // expected-note 2 {{candidate constructor (the implicit copy constructor)}} expected-note 2 {{candidate constructor (the implicit move constructor)}}
   NoValueInit(int i, int j); // expected-note 2 {{candidate constructor}}
 };
 
@@ -25,6 +25,7 @@ void test_cxx_function_cast_multi() {
   (void)NoValueInit(0, 0);
   (void)NoValueInit(0, 0, 0); // expected-error{{no matching constructor for initialization}}
   (void)int(1, 2); // expected-error{{excess elements in scalar initializer}}
+  (void)int({}, 2);           // expected-error{{excess elements in scalar initializer}}
 }