// RUN: %clang_cc1 -std=c++2a -fsyntax-only -fcxx-exceptions -verify=ref,both %s
// RUN: %clang_cc1 -std=c++2a -fsyntax-only -fcxx-exceptions -verify=expected,both %s -fexperimental-new-constant-interpreter
template <unsigned N>
struct S {
S() requires (N==1) = default;
S() requires (N==2) {} // both-note {{declared here}}
consteval S() requires (N==3) = default;
};
consteval int aConstevalFunction() { // both-error {{consteval function never produces a constant expression}}
S<2> s4; // both-note {{non-constexpr constructor 'S' cannot be used in a constant expression}}
return 0;
}
/// We're NOT calling the above function. The diagnostics should appear anyway.
namespace Covariant {
struct A {
virtual constexpr char f() const { return 'Z'; }
char a = f();
};
struct D : A {};
struct Covariant1 {
D d;
virtual const A *f() const;
};
struct Covariant3 : Covariant1 {
constexpr virtual const D *f() const { return &this->d; }
};
constexpr Covariant3 cb;
constexpr const Covariant1 *cb1 = &cb;
static_assert(cb1->f()->a == 'Z');
}