// RUN: %clang_cc1 -verify -std=c++11 %s namespace N { typedef char C; } namespace M { typedef double D; } struct NonLiteral { NonLiteral() {} NonLiteral(int) {} operator int() const { return 0; } }; struct Literal { constexpr Literal() {} operator int() const { return 0; } }; struct S { virtual int ImplicitlyVirtual() const; }; struct T {}; template struct ImplicitVirtualFromDependentBase : T { constexpr int ImplicitlyVirtual() const { return 0; } }; constexpr int a = ImplicitVirtualFromDependentBase().ImplicitlyVirtual(); // expected-error {{constant expression}} expected-note {{cannot evaluate call to virtual function}} constexpr int b = ImplicitVirtualFromDependentBase().ImplicitlyVirtual(); // ok constexpr int c = ImplicitVirtualFromDependentBase().ImplicitVirtualFromDependentBase::ImplicitlyVirtual(); // expected-error {{constant expression}} expected-note {{cannot evaluate call to virtual function}} template struct ConstexprMember { constexpr R F() const { return 0; } }; constexpr int d = ConstexprMember().F(); // ok constexpr int e = ConstexprMember().F(); // expected-error {{constant expression}} expected-note {{non-literal type 'NonLiteral' cannot be used in a constant expression}} template struct ConstexprCtor { constexpr ConstexprCtor(P...) {} }; constexpr ConstexprCtor<> f1() { return {}; } // ok constexpr ConstexprCtor f2() { return 0; } // ok constexpr ConstexprCtor f3() { return { 0 }; } // expected-error {{never produces a constant expression}} expected-note {{non-literal type 'NonLiteral}} constexpr ConstexprCtor f4() { return { 0, 0 }; } // expected-error {{never produces a constant expression}} expected-note {{non-literal type 'NonLiteral}} struct VirtBase : virtual S {}; // expected-note {{here}} namespace TemplateVBase { template struct T1 : virtual Literal { // expected-note {{here}} constexpr T1() {} // expected-error {{constexpr constructor not allowed in struct with virtual base class}} }; template struct T2 : virtual T { // FIXME: This is ill-formed (no diagnostic required). // We should diagnose it now rather than waiting until instantiation. constexpr T2() {} }; constexpr T2 g2() { return {}; } template class T3 : public T { // expected-note {{class with virtual base class is not a literal type}} public: constexpr T3() {} }; constexpr T3 g3() { return {}; } // ok constexpr T3 g4() { return {}; } // expected-error {{not a literal type}} }