r248391 - [Sema] Don't create an invalid source range for overlong initializer lists.

Benjamin Kramer via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 23 09:03:55 PDT 2015


Author: d0k
Date: Wed Sep 23 11:03:53 2015
New Revision: 248391

URL: http://llvm.org/viewvc/llvm-project?rev=248391&view=rev
Log:
[Sema] Don't create an invalid source range for overlong initializer lists.

We took both source locations from the end of the initializer list what
the code below doesn't expect. This can lead to a crash when rendering
the diagnostic (PR24816). Assert that we have more than one element in
a scalar initializer with too many elements.

Modified:
    cfe/trunk/lib/Sema/SemaInit.cpp
    cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp

Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=248391&r1=248390&r2=248391&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Wed Sep 23 11:03:53 2015
@@ -7047,10 +7047,12 @@ bool InitializationSequence::Diagnose(Se
     SourceRange R;
 
     auto *InitList = dyn_cast<InitListExpr>(Args[0]);
-    if (InitList && InitList->getNumInits() == 1)
+    if (InitList && InitList->getNumInits() >= 1) {
       R = SourceRange(InitList->getInit(0)->getLocEnd(), InitList->getLocEnd());
-    else
+    } else {
+      assert(Args.size() > 1 && "Expected multiple initializers!");
       R = SourceRange(Args.front()->getLocEnd(), Args.back()->getLocEnd());
+    }
 
     R.setBegin(S.getLocForEndOfToken(R.getBegin()));
     if (Kind.isCStyleOrFunctionalCast())

Modified: cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp?rev=248391&r1=248390&r2=248391&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp (original)
+++ cfe/trunk/test/SemaCXX/cxx0x-initializer-aggregates.cpp Wed Sep 23 11:03:53 2015
@@ -129,3 +129,7 @@ namespace array_addressof {
   using T = int[5];
   T *p = &T{1,2,3,4,5}; // expected-error {{taking the address of a temporary object of type 'T' (aka 'int [5]')}}
 }
+
+namespace PR24816 {
+  struct { int i; } ne = {{0, 1}}; // expected-error{{excess elements in scalar initializer}}
+}




More information about the cfe-commits mailing list