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}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits