EricWF created this revision.
EricWF added a reviewer: rsmith.
EricWF added a subscriber: cfe-commits.

The C++17 rules for aggregate initialization changed to disallow types with 
explicit constructors [dcl.init.aggr]p1. This patch implements that new rule.


https://reviews.llvm.org/D25654

Files:
  lib/AST/DeclCXX.cpp
  test/SemaCXX/aggregate-initialization.cpp


Index: test/SemaCXX/aggregate-initialization.cpp
===================================================================
--- test/SemaCXX/aggregate-initialization.cpp
+++ test/SemaCXX/aggregate-initialization.cpp
@@ -146,3 +146,12 @@
   // expected-error@-5 {{protected constructor}}
   // expected-note@-30 {{here}}
 }
+
+namespace diff_cpp1z_dcl_init_aggr_example {
+  struct ExplicitDefault { explicit ExplicitDefault() = default; };
+  ExplicitDefault d = {};
+#if __cplusplus > 201402L
+  // expected-error@-2 {{explicit in copy-initialization}}
+  // expected-note@-4 {{here}}
+#endif
+}
Index: lib/AST/DeclCXX.cpp
===================================================================
--- lib/AST/DeclCXX.cpp
+++ lib/AST/DeclCXX.cpp
@@ -560,6 +560,10 @@
             ? Constructor->isUserProvided()
             : !Constructor->isImplicit())
       data().Aggregate = false;
+    // C++1z [dcl.init.aggr]p1:
+    //  - no user-provided, explicit, or inherited constructors,
+    if (getASTContext().getLangOpts().CPlusPlus1z && Constructor->isExplicit())
+      data().Aggregate = false;
   }
 
   // Handle destructors.


Index: test/SemaCXX/aggregate-initialization.cpp
===================================================================
--- test/SemaCXX/aggregate-initialization.cpp
+++ test/SemaCXX/aggregate-initialization.cpp
@@ -146,3 +146,12 @@
   // expected-error@-5 {{protected constructor}}
   // expected-note@-30 {{here}}
 }
+
+namespace diff_cpp1z_dcl_init_aggr_example {
+  struct ExplicitDefault { explicit ExplicitDefault() = default; };
+  ExplicitDefault d = {};
+#if __cplusplus > 201402L
+  // expected-error@-2 {{explicit in copy-initialization}}
+  // expected-note@-4 {{here}}
+#endif
+}
Index: lib/AST/DeclCXX.cpp
===================================================================
--- lib/AST/DeclCXX.cpp
+++ lib/AST/DeclCXX.cpp
@@ -560,6 +560,10 @@
             ? Constructor->isUserProvided()
             : !Constructor->isImplicit())
       data().Aggregate = false;
+    // C++1z [dcl.init.aggr]p1:
+    //  - no user-provided, explicit, or inherited constructors,
+    if (getASTContext().getLangOpts().CPlusPlus1z && Constructor->isExplicit())
+      data().Aggregate = false;
   }
 
   // Handle destructors.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to