p6.cpp revision 86c3ae46250cdcc57778c27826060779a92f3815
1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// RUN: %clang_cc1 -verify -std=c++11 %s 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace N { 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org typedef char C; 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace M { 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org typedef double D; 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.orgstruct NonLiteral { 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org NonLiteral() {} 131bdf186e6ae8d2f1a7d055237a75c0d7fd189624wuchengli@chromium.org NonLiteral(int) {} // expected-note 2{{here}} 14281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org operator int() const { return 0; } 15281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org}; 16281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.orgstruct Literal { 175e8ee6f8a182dd36d0c9f273f180d015a056cef4andrew@webrtc.org constexpr Literal() {} 18281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org operator int() const { return 0; } 1907e96da4b4ae3ba9e722128fc650f6b10ff663f5andrew@webrtc.org}; 20cb9a72be76527005fc1ad580dd9a31e3d0e779f9mflodman@webrtc.org 21281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.orgstruct S { 22281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org virtual int ImplicitlyVirtual() const; 23022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org}; 24281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.orgstruct T {}; 25281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org 26281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.orgtemplate<typename T> struct ImplicitVirtualFromDependentBase : T { 27bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org constexpr int ImplicitlyVirtual() { return 0; } 28281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org}; 29281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconstexpr int a = ImplicitVirtualFromDependentBase<S>().ImplicitlyVirtual(); // expected-error {{constant expression}} expected-note {{cannot evaluate virtual function call}} 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconstexpr int b = ImplicitVirtualFromDependentBase<T>().ImplicitlyVirtual(); // ok 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconstexpr int c = ImplicitVirtualFromDependentBase<S>().ImplicitVirtualFromDependentBase<S>::ImplicitlyVirtual(); 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename R> struct ConstexprMember { 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org constexpr R F() { return 0; } 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 37ac6d919eec548c708588f29923f617a17283c7e2andresp@webrtc.orgconstexpr int d = ConstexprMember<int>().F(); // ok 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconstexpr int e = ConstexprMember<NonLiteral>().F(); // expected-error {{constant expression}} 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtemplate<typename ...P> struct ConstexprCtor { 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org constexpr ConstexprCtor(P...) {} 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconstexpr ConstexprCtor<> f1() { return {}; } // ok 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconstexpr ConstexprCtor<int> f2() { return 0; } // ok 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgconstexpr ConstexprCtor<NonLiteral> f3() { return { 0 }; } // expected-error {{never produces a constant expression}} expected-note {{non-constexpr constructor 'NonLiteral}} 465a669d5b339d7c699662b52d90236dfd5412e024pbos@webrtc.orgconstexpr ConstexprCtor<int, NonLiteral> f4() { return { 0, 0 }; } // expected-error {{never produces a constant expression}} expected-note {{non-constexpr constructor 'NonLiteral}} 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct VirtBase : virtual S {}; // expected-note {{here}} 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace TemplateVBase { 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org template<typename T> struct T1 : virtual Literal { // expected-note {{here}} 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org constexpr T1() {} // expected-error {{constexpr constructor not allowed in struct with virtual base class}} 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }; 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org template<typename T> struct T2 : virtual T { 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // FIXME: This is ill-formed (no diagnostic required). 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // We should diagnose it now rather than waiting until instantiation. 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org constexpr T2() {} 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }; 60bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org constexpr T2<Literal> g2() { return {}; } 619da327cad743253030f65939c316d009bb48d8e1asapersson@webrtc.org 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org template<typename T> class T3 : public T { // expected-note {{class with virtual base class is not a literal type}} 63022615bd918aec7671968ad2b873d1487365980cmflodman@webrtc.org public: 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org constexpr T3() {} 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org }; 66bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org constexpr T3<Literal> g3() { return {}; } // ok 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org constexpr T3<VirtBase> g4() { return {}; } // expected-error {{not a literal type}} 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org