@@ -81,6 +81,7 @@ CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
8181 HasPrivateFields(false ), HasProtectedFields(false ),
8282 HasPublicFields(false ), HasMutableFields(false ), HasVariantMembers(false ),
8383 HasOnlyCMembers(true ), HasInitMethod(false ), HasInClassInitializer(false ),
84+ HasUninitializedExplicitInitFields(false ),
8485 HasUninitializedReferenceMember(false ), HasUninitializedFields(false ),
8586 HasInheritedConstructor(false ), HasInheritedDefaultConstructor(false ),
8687 HasInheritedAssignment(false ),
@@ -1108,6 +1109,10 @@ void CXXRecordDecl::addedMember(Decl *D) {
11081109 } else if (!T.isCXX98PODType (Context))
11091110 data ().PlainOldData = false ;
11101111
1112+ if (Field->hasAttr <ExplicitInitAttr>() && !Field->hasInClassInitializer ()) {
1113+ data ().HasUninitializedExplicitInitFields = true ;
1114+ }
1115+
11111116 if (T->isReferenceType ()) {
11121117 if (!Field->hasInClassInitializer ())
11131118 data ().HasUninitializedReferenceMember = true ;
@@ -1359,6 +1364,10 @@ void CXXRecordDecl::addedMember(Decl *D) {
13591364 if (!FieldRec->hasCopyAssignmentWithConstParam ())
13601365 data ().ImplicitCopyAssignmentHasConstParam = false ;
13611366
1367+ if (FieldRec->hasUninitializedExplicitInitFields () &&
1368+ FieldRec->isAggregate () && !Field->hasInClassInitializer ())
1369+ data ().HasUninitializedExplicitInitFields = true ;
1370+
13621371 if (FieldRec->hasUninitializedReferenceMember () &&
13631372 !Field->hasInClassInitializer ())
13641373 data ().HasUninitializedReferenceMember = true ;
@@ -2133,6 +2142,18 @@ void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
21332142 for (conversion_iterator I = conversion_begin (), E = conversion_end ();
21342143 I != E; ++I)
21352144 I.setAccess ((*I)->getAccess ());
2145+
2146+ ASTContext &Context = getASTContext ();
2147+ if (!Context.getLangOpts ().CPlusPlus20 && hasUserDeclaredConstructor ()) {
2148+ // Diagnose any aggregate behavior changes in C++20
2149+ for (field_iterator I = field_begin (), E = field_end (); I != E; ++I) {
2150+ if (const auto *attr = I->getAttr <ExplicitAttr>()) {
2151+ Context.getDiagnostics ().Report (
2152+ getLocation (), diag::warn_cxx20_compat_aggregate_init_with_ctors)
2153+ << attr->getRange () << Context.getRecordType (this );
2154+ }
2155+ }
2156+ }
21362157}
21372158
21382159bool CXXRecordDecl::mayBeAbstract () const {
0 commit comments