llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) <details> <summary>Changes</summary> If a member or base initializer of a constructor turns out to be invalid, mark the entire constructor as invalid. --- Full diff: https://github.com/llvm/llvm-project/pull/137773.diff 5 Files Affected: - (modified) clang/lib/Parse/ParseDeclCXX.cpp (+3-1) - (modified) clang/test/SemaCXX/class-base-member-init.cpp (+1-1) - (modified) clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp (+2-2) - (modified) clang/test/SemaCXX/constexpr-subobj-initialization.cpp (+4-4) - (modified) clang/test/SemaCXX/constructor-initializer.cpp (+7-3) ``````````diff diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 51fe0663a8d1a..7212ac8daea23 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -4064,8 +4064,10 @@ void Parser::ParseConstructorInitializer(Decl *ConstructorDecl) { MemInitResult MemInit = ParseMemInitializer(ConstructorDecl); if (!MemInit.isInvalid()) MemInitializers.push_back(MemInit.get()); - else + else { + ConstructorDecl->setInvalidDecl(); AnyErrors = true; + } if (Tok.is(tok::comma)) ConsumeToken(); diff --git a/clang/test/SemaCXX/class-base-member-init.cpp b/clang/test/SemaCXX/class-base-member-init.cpp index a6bb4410a81c8..cf297328c1f83 100644 --- a/clang/test/SemaCXX/class-base-member-init.cpp +++ b/clang/test/SemaCXX/class-base-member-init.cpp @@ -86,7 +86,7 @@ namespace test5 { decltype(Base(1))(2), // expected-error {{multiple initializations given for base 'decltype(Base(1))' (aka 'test5::Base')}} decltype(int())() { // expected-error {{constructor initializer 'decltype(int())' (aka 'int') does not name a class}} } - A(float) : decltype(A())(3) { + A(float) : decltype(A())(3) { // expected-error {{constructor for 'A' creates a delegation cycle}} } }; } diff --git a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp index 7a6d7cb353158..474ad587bacc6 100644 --- a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp +++ b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp @@ -535,9 +535,9 @@ namespace InvalidBaseClass { }; class InBetween : public F{}; - class E : public InBetween { + class E : public InBetween { // expected-note 2{{candidate constructor}} public: constexpr E() : F{3} {} // expected-error {{not a direct or virtual base}} }; - static_assert(__builtin_bit_cast(char, E()) == 0); // expected-error {{not an integral constant expression}} + static_assert(__builtin_bit_cast(char, E()) == 0); // expected-error {{no matching constructor}} } diff --git a/clang/test/SemaCXX/constexpr-subobj-initialization.cpp b/clang/test/SemaCXX/constexpr-subobj-initialization.cpp index f0252df1e2ce1..f0abe09d23bf4 100644 --- a/clang/test/SemaCXX/constexpr-subobj-initialization.cpp +++ b/clang/test/SemaCXX/constexpr-subobj-initialization.cpp @@ -16,17 +16,17 @@ struct Bar : Foo { constexpr Bar bar; // expected-error {{must be initialized by a constant expression}} struct Base {}; -struct A : Base { // expected-note-re {{constructor of base class '{{.*}}Base' is not called}} +struct A : Base { // expected-note 2{{candidate constructor}} constexpr A() : value() {} // expected-error {{member initializer 'value' does not name a non-static data member or base class}} }; -constexpr A a; // expected-error {{must be initialized by a constant expression}} +constexpr A a; // expected-error {{no matching constructor}} -struct B : Base { // expected-note-re {{constructor of base class '{{.*}}Base' is not called}} +struct B : Base { // expected-note 2{{candidate constructor}} constexpr B() : {} // expected-error {{expected class member or base class name}} }; -constexpr B b; // expected-error {{must be initialized by a constant expression}} +constexpr B b; // expected-error {{no matching constructor}} } // namespace baseclass_uninit diff --git a/clang/test/SemaCXX/constructor-initializer.cpp b/clang/test/SemaCXX/constructor-initializer.cpp index 96be8dda97735..c8b1cfbae65ce 100644 --- a/clang/test/SemaCXX/constructor-initializer.cpp +++ b/clang/test/SemaCXX/constructor-initializer.cpp @@ -2,16 +2,20 @@ // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify -std=c++98 %s // RUN: %clang_cc1 -Wreorder -fsyntax-only -verify -std=c++11 %s -class A { +class A { + // expected-note@-1 {{candidate constructor}} +#if __cplusplus >= 201103L // C++11 or later + // expected-note@-3 {{candidate constructor}} +#endif int m; public: A() : A::m(17) { } // expected-error {{member initializer 'm' does not name a non-static data member or base class}} - A(int); + A(int); // expected-note {{candidate constructor}} }; class B : public A { public: - B() : A(), m(1), n(3.14) { } + B() : A(), m(1), n(3.14) { } // expected-error {{no matching constructor for initialization of 'A'}} private: int m; `````````` </details> https://github.com/llvm/llvm-project/pull/137773 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits