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