r254889 - Fix PR20334: invalid assertion while diagnosing list initialization failure
Faisal Vali via cfe-commits
cfe-commits at lists.llvm.org
Sun Dec 6 18:37:47 PST 2015
Author: faisalv
Date: Sun Dec 6 20:37:44 2015
New Revision: 254889
URL: http://llvm.org/viewvc/llvm-project?rev=254889&view=rev
Log:
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.
Added:
cfe/trunk/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp
Modified:
cfe/trunk/lib/Sema/SemaInit.cpp
Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=254889&r1=254888&r2=254889&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Sun Dec 6 20:37:44 2015
@@ -3732,7 +3732,9 @@ static void TryListInitialization(Sema &
// 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
Added: cfe/trunk/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp?rev=254889&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp (added)
+++ cfe/trunk/test/SemaCXX/PR20334-std_initializer_list_diagnosis_assertion.cpp Sun Dec 6 20:37:44 2015
@@ -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 _E>
+ class initializer_list
+ {};
+}
+
+template<class E> int f(std::initializer_list<E> il);
+
+
+int F = f({1, 2, 3});
+#ifdef CPP98
+//expected-error at -2{{expected expression}}
+#else
+//expected-error at -4{{cannot compile}}
+#endif
+
+
More information about the cfe-commits
mailing list