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