From: Faisal Vali Date: Mon, 7 Dec 2015 02:37:44 +0000 (+0000) Subject: Fix PR20334: invalid assertion while diagnosing list initialization failure X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c3e091e3e74a72677cdaf58610f32311497dae78;p=clang Fix PR20334: invalid assertion while diagnosing list initialization failure https://llvm.org/bugs/show_bug.cgi?id=20334 Unfortunately, clang currently checks for a certain brokenness of implementations of std::initializer_list in CodeGen (void AggExprEmitter::VisitCXXStdInitializerListExpr), not in SemaInit. Until that is fixed, make sure we don't let broken attempts that are aggregates leak through into sema, which allows maintenance of expected invariants, and avoids triggering an assertion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@254889 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 89d253981c..0f60ad10a3 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -3732,7 +3732,9 @@ static void TryListInitialization(Sema &S, // C++11 [dcl.init.list]p3: // - If T is an aggregate, aggregate initialization is performed. - if (DestType->isRecordType() && !DestType->isAggregateType()) { + if ((DestType->isRecordType() && !DestType->isAggregateType()) || + (S.getLangOpts().CPlusPlus11 && + S.isStdInitializerList(DestType, nullptr))) { if (S.getLangOpts().CPlusPlus11) { // - Otherwise, if the initializer list has no elements and T is a // class type with a default constructor, the object is diff --git a/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp b/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp new file mode 100644 index 0000000000..ec672089b8 --- /dev/null +++ b/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -std=c++11 -verify -emit-llvm-only %s +// RUN: %clang_cc1 -std=c++98 -fsyntax-only -verify %s -DCPP98 + +namespace std { + template + class initializer_list + {}; +} + +template int f(std::initializer_list il); + + +int F = f({1, 2, 3}); +#ifdef CPP98 +//expected-error@-2{{expected expression}} +#else +//expected-error@-4{{cannot compile}} +#endif + +