rsmith added inline comments. ================ Comment at: lib/AST/DeclCXX.cpp:396-425 @@ -394,1 +395,32 @@ +bool CXXRecordDecl::allowConstDefaultInitSlow() const { + assert(getDefinition() && "only call this on completed records"); + if (hasUserProvidedDefaultConstructor()) { + data().setAllowConstDefInitKind(DefinitionData::ACDI_Yes); + return true; + } + for (const auto *F : fields()) { + if (F->hasInClassInitializer() || F->isMutable() || F->isUnnamedBitfield()) + continue; + if (CXXRecordDecl *FieldType = F->getType()->getAsCXXRecordDecl()) { + if (!FieldType->allowConstDefaultInit()) { + data().setAllowConstDefInitKind(DefinitionData::ACDI_No); + return false; + } + } else { + data().setAllowConstDefInitKind(DefinitionData::ACDI_No); + return false; + } + } + for (const auto& BI : bases()) { + const RecordType *RT = BI.getType()->getAs<RecordType>(); + CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl()); + if (!Base->allowConstDefaultInit()) { + data().setAllowConstDefInitKind(DefinitionData::ACDI_No); + return false; + } + } + data().setAllowConstDefInitKind(DefinitionData::ACDI_Yes); + return true; +} + ---------------- I don't expect this to be a measurable cost either way. I would strongly prefer to use the same pattern for all of these flags unless we have a really good reason not to.
================ Comment at: lib/Serialization/ASTReaderDecl.cpp:1517-1562 @@ -1515,48 +1516,48 @@ // FIXME: Move this out into a .def file? bool DetectedOdrViolation = false; #define OR_FIELD(Field) DD.Field |= MergeDD.Field; #define MATCH_FIELD(Field) \ DetectedOdrViolation |= DD.Field != MergeDD.Field; \ OR_FIELD(Field) MATCH_FIELD(UserDeclaredConstructor) MATCH_FIELD(UserDeclaredSpecialMembers) MATCH_FIELD(Aggregate) MATCH_FIELD(PlainOldData) MATCH_FIELD(Empty) MATCH_FIELD(Polymorphic) MATCH_FIELD(Abstract) MATCH_FIELD(IsStandardLayout) MATCH_FIELD(HasNoNonEmptyBases) MATCH_FIELD(HasPrivateFields) MATCH_FIELD(HasProtectedFields) MATCH_FIELD(HasPublicFields) MATCH_FIELD(HasMutableFields) MATCH_FIELD(HasVariantMembers) MATCH_FIELD(HasOnlyCMembers) MATCH_FIELD(HasInClassInitializer) MATCH_FIELD(HasUninitializedReferenceMember) MATCH_FIELD(NeedOverloadResolutionForMoveConstructor) MATCH_FIELD(NeedOverloadResolutionForMoveAssignment) MATCH_FIELD(NeedOverloadResolutionForDestructor) MATCH_FIELD(DefaultedMoveConstructorIsDeleted) MATCH_FIELD(DefaultedMoveAssignmentIsDeleted) MATCH_FIELD(DefaultedDestructorIsDeleted) OR_FIELD(HasTrivialSpecialMembers) OR_FIELD(DeclaredNonTrivialSpecialMembers) MATCH_FIELD(HasIrrelevantDestructor) OR_FIELD(HasConstexprNonCopyMoveConstructor) MATCH_FIELD(DefaultedDefaultConstructorIsConstexpr) OR_FIELD(HasConstexprDefaultConstructor) MATCH_FIELD(HasNonLiteralTypeFieldsOrBases) // ComputedVisibleConversions is handled below. MATCH_FIELD(UserProvidedDefaultConstructor) OR_FIELD(DeclaredSpecialMembers) MATCH_FIELD(ImplicitCopyConstructorHasConstParam) MATCH_FIELD(ImplicitCopyAssignmentHasConstParam) OR_FIELD(HasDeclaredCopyConstructorWithConstParam) OR_FIELD(HasDeclaredCopyAssignmentWithConstParam) MATCH_FIELD(IsLambda) #undef OR_FIELD #undef MATCH_FIELD ---------------- You should update this block too. ================ Comment at: test/CXX/drs/dr4xx.cpp:1200 @@ -1199,3 +1199,3 @@ -namespace dr497 { // dr497: yes +namespace dr497 { // dr497: no, superseded by dr253 void before() { ---------------- Write this as "dr497: sup 253", and rerun www/make_cxx_dr_status to generate a new www/cxx_dr_status.html file. (You'll need to grab a cwg_index.html from the WG21 website.) http://reviews.llvm.org/D16552 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits