r261297 - Implement the likely resolution of core issue 253.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 19 13:29:15 PST 2016


On Thu, Feb 18, 2016 at 5:52 PM, Nico Weber via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: nico
> Date: Thu Feb 18 19:52:46 2016
> New Revision: 261297
>
> URL: http://llvm.org/viewvc/llvm-project?rev=261297&view=rev
> Log:
> Implement the likely resolution of core issue 253.
>
> C++11 requires const objects to have a user-provided constructor, even for
> classes without any fields. DR 253 relaxes this to say "If the implicit default
> constructor initializes all subobjects, no initializer should be required."
>
> clang is currently the only compiler that implements this C++11 rule, and e.g.
> libstdc++ relies on something like DR 253 to compile in newer versions.  This
> change  makes it possible to build code that says `const vector<int> v;' again
> when using libstdc++5.2 and _GLIBCXX_DEBUG
> (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60284).
>
> Fixes PR23381.
>
> http://reviews.llvm.org/D16552
>
> Modified:
>     cfe/trunk/include/clang/AST/DeclCXX.h
>     cfe/trunk/lib/AST/ASTImporter.cpp
>     cfe/trunk/lib/AST/DeclCXX.cpp
>     cfe/trunk/lib/Sema/SemaInit.cpp
>     cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
>     cfe/trunk/lib/Serialization/ASTWriter.cpp
>     cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp
>     cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp
>     cfe/trunk/test/CXX/drs/dr4xx.cpp
>     cfe/trunk/test/SemaCXX/attr-selectany.cpp
>     cfe/trunk/test/SemaCXX/constexpr-value-init.cpp
>     cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp
>     cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp
>     cfe/trunk/www/cxx_dr_status.html
>
> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
> +++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Feb 18 19:52:46 2016
> @@ -378,6 +378,10 @@ class CXXRecordDecl : public RecordDecl
>      /// even if the class has a trivial default constructor.
>      bool HasUninitializedReferenceMember : 1;
>
> +    /// \brief True if any non-mutable field whose type doesn't have a user-
> +    /// provided default ctor also doesn't have an in-class initializer.
> +    bool HasUninitializedFields : 1;
> +
>      /// \brief These flags are \c true if a defaulted corresponding special
>      /// member can't be fully analyzed without performing overload resolution.
>      /// @{
> @@ -1270,6 +1274,13 @@ public:
>      return !(data().HasTrivialSpecialMembers & SMF_Destructor);
>    }
>
> +  /// \brief Determine whether declaring a const variable with this type is ok
> +  /// per core issue 253.
> +  bool allowConstDefaultInit() const {
> +    return !data().HasUninitializedFields ||
> +           hasUserProvidedDefaultConstructor();

hasUserProvidedDefaultConstructor() here is subtly incorrect. We
shouldn't care whether there's a user-provided default constructor, we
instead care whether the constructor that would have been chosen for
initialization is defaulted (or equivalently, whether there *is* a
defaulted default constructor, since if there is one, then either the
initialization is ambiguous or it is chosen).

This causes a regression for a testcase such as:

struct X { template<typename ...T> X(T...); int n; };
const X x; // formerly OK, now bogus error

> +  }
> +
>    /// \brief Determine whether this class has a destructor which has no
>    /// semantic effect.
>    ///
>
> Modified: cfe/trunk/lib/AST/ASTImporter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
> +++ cfe/trunk/lib/AST/ASTImporter.cpp Thu Feb 18 19:52:46 2016
> @@ -2024,6 +2024,7 @@ bool ASTNodeImporter::ImportDefinition(R
>      ToData.HasInClassInitializer = FromData.HasInClassInitializer;
>      ToData.HasUninitializedReferenceMember
>        = FromData.HasUninitializedReferenceMember;
> +    ToData.HasUninitializedFields = FromData.HasUninitializedFields;
>      ToData.NeedOverloadResolutionForMoveConstructor
>        = FromData.NeedOverloadResolutionForMoveConstructor;
>      ToData.NeedOverloadResolutionForMoveAssignment
>
> Modified: cfe/trunk/lib/AST/DeclCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclCXX.cpp (original)
> +++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Feb 18 19:52:46 2016
> @@ -46,34 +46,31 @@ void LazyASTUnresolvedSet::getFromExtern
>  }
>
>  CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D)
> -  : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0),
> -    Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
> -    Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true),
> -    HasPrivateFields(false), HasProtectedFields(false), HasPublicFields(false),
> -    HasMutableFields(false), HasVariantMembers(false), HasOnlyCMembers(true),
> -    HasInClassInitializer(false), HasUninitializedReferenceMember(false),
> -    NeedOverloadResolutionForMoveConstructor(false),
> -    NeedOverloadResolutionForMoveAssignment(false),
> -    NeedOverloadResolutionForDestructor(false),
> -    DefaultedMoveConstructorIsDeleted(false),
> -    DefaultedMoveAssignmentIsDeleted(false),
> -    DefaultedDestructorIsDeleted(false),
> -    HasTrivialSpecialMembers(SMF_All),
> -    DeclaredNonTrivialSpecialMembers(0),
> -    HasIrrelevantDestructor(true),
> -    HasConstexprNonCopyMoveConstructor(false),
> -    DefaultedDefaultConstructorIsConstexpr(true),
> -    HasConstexprDefaultConstructor(false),
> -    HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false),
> -    UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
> -    ImplicitCopyConstructorHasConstParam(true),
> -    ImplicitCopyAssignmentHasConstParam(true),
> -    HasDeclaredCopyConstructorWithConstParam(false),
> -    HasDeclaredCopyAssignmentWithConstParam(false),
> -    IsLambda(false), IsParsingBaseSpecifiers(false), NumBases(0), NumVBases(0),
> -    Bases(), VBases(),
> -    Definition(D), FirstFriend() {
> -}
> +    : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0),
> +      Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false),
> +      Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true),
> +      HasPrivateFields(false), HasProtectedFields(false),
> +      HasPublicFields(false), HasMutableFields(false), HasVariantMembers(false),
> +      HasOnlyCMembers(true), HasInClassInitializer(false),
> +      HasUninitializedReferenceMember(false), HasUninitializedFields(false),
> +      NeedOverloadResolutionForMoveConstructor(false),
> +      NeedOverloadResolutionForMoveAssignment(false),
> +      NeedOverloadResolutionForDestructor(false),
> +      DefaultedMoveConstructorIsDeleted(false),
> +      DefaultedMoveAssignmentIsDeleted(false),
> +      DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All),
> +      DeclaredNonTrivialSpecialMembers(0), HasIrrelevantDestructor(true),
> +      HasConstexprNonCopyMoveConstructor(false),
> +      DefaultedDefaultConstructorIsConstexpr(true),
> +      HasConstexprDefaultConstructor(false),
> +      HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false),
> +      UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0),
> +      ImplicitCopyConstructorHasConstParam(true),
> +      ImplicitCopyAssignmentHasConstParam(true),
> +      HasDeclaredCopyConstructorWithConstParam(false),
> +      HasDeclaredCopyAssignmentWithConstParam(false), IsLambda(false),
> +      IsParsingBaseSpecifiers(false), NumBases(0), NumVBases(0), Bases(),
> +      VBases(), Definition(D), FirstFriend() {}
>
>  CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const {
>    return Bases.get(Definition->getASTContext().getExternalSource());
> @@ -332,6 +329,9 @@ CXXRecordDecl::setBases(CXXBaseSpecifier
>      if (BaseClassDecl->hasUninitializedReferenceMember())
>        data().HasUninitializedReferenceMember = true;
>
> +    if (!BaseClassDecl->allowConstDefaultInit())
> +      data().HasUninitializedFields = true;
> +
>      addedClassSubobject(BaseClassDecl);
>    }
>
> @@ -702,6 +702,15 @@ void CXXRecordDecl::addedMember(Decl *D)
>        data().IsStandardLayout = false;
>      }
>
> +    if (!Field->hasInClassInitializer() && !Field->isMutable()) {
> +      if (CXXRecordDecl *FieldType = Field->getType()->getAsCXXRecordDecl()) {
> +        if (!FieldType->allowConstDefaultInit())
> +          data().HasUninitializedFields = true;
> +      } else {
> +        data().HasUninitializedFields = true;
> +      }
> +    }
> +
>      // Record if this field is the first non-literal or volatile field or base.
>      if (!T->isLiteralType(Context) || T.isVolatileQualified())
>        data().HasNonLiteralTypeFieldsOrBases = true;
>
> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaInit.cpp Thu Feb 18 19:52:46 2016
> @@ -3515,18 +3515,23 @@ static void TryConstructorInitialization
>    //   If a program calls for the default initialization of an object
>    //   of a const-qualified type T, T shall be a class type with a
>    //   user-provided default constructor.
> +  // C++ core issue 253 proposal:
> +  //   If the implicit default constructor initializes all subobjects, no
> +  //   initializer should be required.
> +  // The 253 proposal is for example needed to process libstdc++ headers in 5.x.
> +  CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
>    if (Kind.getKind() == InitializationKind::IK_Default &&
> -      Entity.getType().isConstQualified() &&
> -      !cast<CXXConstructorDecl>(Best->Function)->isUserProvided()) {
> -    if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
> -      Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
> -    return;
> +      Entity.getType().isConstQualified()) {
> +    if (!CtorDecl->getParent()->allowConstDefaultInit()) {
> +      if (!maybeRecoverWithZeroInitialization(S, Sequence, Entity))
> +        Sequence.SetFailed(InitializationSequence::FK_DefaultInitOfConst);
> +      return;
> +    }
>    }
>
>    // C++11 [over.match.list]p1:
>    //   In copy-list-initialization, if an explicit constructor is chosen, the
>    //   initializer is ill-formed.
> -  CXXConstructorDecl *CtorDecl = cast<CXXConstructorDecl>(Best->Function);
>    if (IsListInit && !Kind.AllowExplicit() && CtorDecl->isExplicit()) {
>      Sequence.SetFailed(InitializationSequence::FK_ExplicitConstructor);
>      return;
>
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Feb 18 19:52:46 2016
> @@ -1412,6 +1412,7 @@ void ASTDeclReader::ReadCXXDefinitionDat
>    Data.HasOnlyCMembers = Record[Idx++];
>    Data.HasInClassInitializer = Record[Idx++];
>    Data.HasUninitializedReferenceMember = Record[Idx++];
> +  Data.HasUninitializedFields = Record[Idx++];
>    Data.NeedOverloadResolutionForMoveConstructor = Record[Idx++];
>    Data.NeedOverloadResolutionForMoveAssignment = Record[Idx++];
>    Data.NeedOverloadResolutionForDestructor = Record[Idx++];
> @@ -1536,6 +1537,7 @@ void ASTDeclReader::MergeDefinitionData(
>    MATCH_FIELD(HasOnlyCMembers)
>    MATCH_FIELD(HasInClassInitializer)
>    MATCH_FIELD(HasUninitializedReferenceMember)
> +  MATCH_FIELD(HasUninitializedFields)
>    MATCH_FIELD(NeedOverloadResolutionForMoveConstructor)
>    MATCH_FIELD(NeedOverloadResolutionForMoveAssignment)
>    MATCH_FIELD(NeedOverloadResolutionForDestructor)
>
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Feb 18 19:52:46 2016
> @@ -5547,6 +5547,7 @@ void ASTWriter::AddCXXDefinitionData(con
>    Record.push_back(Data.HasOnlyCMembers);
>    Record.push_back(Data.HasInClassInitializer);
>    Record.push_back(Data.HasUninitializedReferenceMember);
> +  Record.push_back(Data.HasUninitializedFields);
>    Record.push_back(Data.NeedOverloadResolutionForMoveConstructor);
>    Record.push_back(Data.NeedOverloadResolutionForMoveAssignment);
>    Record.push_back(Data.NeedOverloadResolutionForDestructor);
>
> Modified: cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p2.cpp Thu Feb 18 19:52:46 2016
> @@ -116,6 +116,7 @@ static_assert(!noexcept(e5 = e5), "");
>  namespace PR13492 {
>    struct B {
>      B() = default;
> +    int field;
>    };
>
>    void f() {
>
> Modified: cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp (original)
> +++ cfe/trunk/test/CXX/dcl.decl/dcl.init/p6.cpp Thu Feb 18 19:52:46 2016
> @@ -4,9 +4,9 @@
>
>  // If a program calls for the default initialization of an object of a
>  // const-qualified type T, T shall be a class type with a
> -// user-provided default constructor.
> +// user-provided default constructor, except if T has no uninitialized fields.
>  struct MakeNonPOD { MakeNonPOD(); };
> -struct NoUserDefault : public MakeNonPOD { };
> +struct NoUserDefault : public MakeNonPOD { int field; };
>  struct HasUserDefault { HasUserDefault(); };
>
>  void test_const_default_init() {
> @@ -16,7 +16,7 @@ void test_const_default_init() {
>  }
>
>  // rdar://8501008
> -struct s0 {};
> +struct s0 { int field; };
>  struct s1 { static const s0 foo; };
>  const struct s0 s1::foo; // expected-error{{default initialization of an object of const type 'const struct s0' without a user-provided default constructor}}
>
>
> Modified: cfe/trunk/test/CXX/drs/dr4xx.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/drs/dr4xx.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/test/CXX/drs/dr4xx.cpp (original)
> +++ cfe/trunk/test/CXX/drs/dr4xx.cpp Thu Feb 18 19:52:46 2016
> @@ -1197,12 +1197,12 @@ namespace dr496 { // dr496: no
>    int check6[ __is_trivially_assignable(B, const B&) ? 1 : -1];
>  }
>
> -namespace dr497 { // dr497: yes
> +namespace dr497 { // dr497: sup 253
>    void before() {
>      struct S {
>        mutable int i;
>      };
> -    const S cs; // expected-error {{default initialization}}
> +    const S cs;
>      int S::*pm = &S::i;
>      cs.*pm = 88; // expected-error {{not assignable}}
>    }
>
> Modified: cfe/trunk/test/SemaCXX/attr-selectany.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-selectany.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/attr-selectany.cpp (original)
> +++ cfe/trunk/test/SemaCXX/attr-selectany.cpp Thu Feb 18 19:52:46 2016
> @@ -39,7 +39,9 @@ __declspec(selectany) auto x8 = Internal
>  // The D3D11 headers do something like this.  MSVC doesn't error on this at
>  // all, even without the __declspec(selectany), in violation of the standard.
>  // We fall back to a warning for selectany to accept headers.
> -struct SomeStruct {};
> +struct SomeStruct {
> +  int foo;
> +};
>  extern const __declspec(selectany) SomeStruct some_struct; // expected-warning {{default initialization of an object of const type 'const SomeStruct' without a user-provided default constructor is a Microsoft extension}}
>
>  // It should be possible to redeclare variables that were defined
>
> Modified: cfe/trunk/test/SemaCXX/constexpr-value-init.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constexpr-value-init.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/constexpr-value-init.cpp (original)
> +++ cfe/trunk/test/SemaCXX/constexpr-value-init.cpp Thu Feb 18 19:52:46 2016
> @@ -14,7 +14,7 @@ void f() {
>    constexpr A a; // expected-error {{constant expression}} expected-note {{in call to 'A()'}}
>  }
>
> -constexpr B b1; // expected-error {{without a user-provided default constructor}}
> +constexpr B b1; // ok
>  constexpr B b2 = B(); // ok
>  static_assert(b2.a.a == 1, "");
>  static_assert(b2.a.b == 2, "");
>
> Modified: cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp (original)
> +++ cfe/trunk/test/SemaCXX/cxx0x-cursory-default-delete.cpp Thu Feb 18 19:52:46 2016
> @@ -11,6 +11,7 @@ struct non_const_copy {
>    non_const_copy& operator = (non_const_copy&) &;
>    non_const_copy& operator = (non_const_copy&) &&;
>    non_const_copy() = default; // expected-note {{not viable}}
> +  int uninit_field;
>  };
>  non_const_copy::non_const_copy(non_const_copy&) = default; // expected-note {{not viable}}
>  non_const_copy& non_const_copy::operator = (non_const_copy&) & = default; // expected-note {{not viable}}
> @@ -30,6 +31,65 @@ void fn1 () {
>    ncc = cncc; // expected-error {{no viable overloaded}}
>  };
>
> +struct no_fields { };
> +struct all_init {
> +  int a = 0;
> +  int b = 0;
> +};
> +struct some_init {
> +  int a = 0;
> +  int b;
> +  int c = 0;
> +};
> +struct some_init_mutable {
> +  int a = 0;
> +  mutable int b;
> +  int c = 0;
> +};
> +struct some_init_def {
> +  some_init_def() = default;
> +  int a = 0;
> +  int b;
> +  int c = 0;
> +};
> +struct some_init_ctor {
> +  some_init_ctor();
> +  int a = 0;
> +  int b;
> +  int c = 0;
> +};
> +struct sub_some_init : public some_init_def { };
> +struct sub_some_init_ctor : public some_init_def {
> +  sub_some_init_ctor();
> +};
> +struct sub_some_init_ctor2 : public some_init_ctor {
> +};
> +struct some_init_container {
> +  some_init_def sid;
> +};
> +struct some_init_container_ctor {
> +  some_init_container_ctor();
> +  some_init_def sid;
> +};
> +struct no_fields_container {
> +  no_fields nf;
> +};
> +
> +void constobjs() {
> +  const no_fields nf; // ok
> +  const all_init ai; // ok
> +  const some_init si; // expected-error {{default initialization of an object of const type 'const some_init' without a user-provided default constructor}}
> +  const some_init_mutable sim; // ok
> +  const some_init_def sid; // expected-error {{default initialization of an object of const type 'const some_init_def' without a user-provided default constructor}}
> +  const some_init_ctor sic; // ok
> +  const sub_some_init ssi; // expected-error {{default initialization of an object of const type 'const sub_some_init' without a user-provided default constructor}}
> +  const sub_some_init_ctor ssic; // ok
> +  const sub_some_init_ctor2 ssic2; // ok
> +  const some_init_container sicon; // expected-error {{default initialization of an object of const type 'const some_init_container' without a user-provided default constructor}}
> +  const some_init_container_ctor siconc; // ok
> +  const no_fields_container nfc; // ok
> +}
> +
>  struct non_const_derived : non_const_copy {
>    non_const_derived(const non_const_derived&) = default; // expected-error {{requires it to be non-const}}
>    non_const_derived& operator =(non_const_derived&) = default;
>
> Modified: cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp (original)
> +++ cfe/trunk/test/SemaCXX/illegal-member-initialization.cpp Thu Feb 18 19:52:46 2016
> @@ -7,6 +7,7 @@ struct A {
>  };
>
>  struct B {
> +  int field;
>  };
>
>  struct X {
>
> Modified: cfe/trunk/www/cxx_dr_status.html
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/www/cxx_dr_status.html?rev=261297&r1=261296&r2=261297&view=diff
> ==============================================================================
> --- cfe/trunk/www/cxx_dr_status.html (original)
> +++ cfe/trunk/www/cxx_dr_status.html Thu Feb 18 19:52:46 2016
> @@ -3023,7 +3023,7 @@ of class templates</td>
>      <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#497">497</a></td>
>      <td>CD1</td>
>      <td>Missing required initialization in example</td>
> -    <td class="full" align="center">Yes</td>
> +    <td class="none" align="center">Superseded by <a href="#253">253</a></td>
>    </tr>
>    <tr class="open" id="498">
>      <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#498">498</a></td>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list