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@-2{{expected expression}}
+#else
+//expected-error@-4{{cannot compile}}
+#endif
+
+


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to