llvm-capstone/clang/test/SemaCXX/constexpr-subobj-initialization.cpp
Takuya Shimizu 24c91d4432 [clang][ExprConstant] Fix crash on uninitialized base class subobject
This patch fixes the reported regression caused by D146358 through adding notes about an uninitialized base class when we diagnose uninitialized constructor.

This also changes the wording from the old one in order to make it clear that the uninitialized subobject is a base class and its constructor is not called.
Wording changes:
BEFORE: `subobject of type 'Base' is not initialized`
AFTER: `constructor of base class 'Base' is not called`

Fixes https://github.com/llvm/llvm-project/issues/63496

Reviewed By: aaron.ballman
Differential Revision: https://reviews.llvm.org/D153969
2023-08-08 15:53:17 +09:00

59 lines
2.1 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
namespace baseclass_uninit {
struct DelBase {
constexpr DelBase() = delete; // expected-note {{'DelBase' has been explicitly marked deleted here}}
};
struct Foo : DelBase { // expected-note 2{{constructor of base class 'DelBase' is not called}}
constexpr Foo() {}; // expected-error {{call to deleted constructor of 'DelBase'}}
};
constexpr Foo f; // expected-error {{must be initialized by a constant expression}}
struct Bar : Foo {
constexpr Bar() {};
};
constexpr Bar bar; // expected-error {{must be initialized by a constant expression}}
struct Base {};
struct A : Base { // expected-note {{constructor of base class 'Base' is not called}}
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}}
struct B : Base { // expected-note {{constructor of base class 'Base' is not called}}
constexpr B() : {} // expected-error {{expected class member or base class name}}
};
constexpr B b; // expected-error {{must be initialized by a constant expression}}
} // namespace baseclass_uninit
struct Foo {
constexpr Foo(); // expected-note 2{{declared here}}
};
constexpr Foo ff; // expected-error {{must be initialized by a constant expression}} \
// expected-note {{undefined constructor 'Foo' cannot be used in a constant expression}}
struct Bar : protected Foo {
int i;
constexpr Bar() : i(12) {} // expected-note {{undefined constructor 'Foo' cannot be used in a constant expression}}
};
constexpr Bar bb; // expected-error {{must be initialized by a constant expression}} \
// expected-note {{in call to 'Bar()'}}
template <typename Ty>
struct Baz {
constexpr Baz(); // expected-note {{declared here}}
};
struct Quux : Baz<Foo>, private Bar {
int i;
constexpr Quux() : i(12) {} // expected-note {{undefined constructor 'Baz' cannot be used in a constant expression}}
};
constexpr Quux qx; // expected-error {{must be initialized by a constant expression}} \
// expected-note {{in call to 'Quux()'}}