1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2 3 using size_t = decltype(sizeof(int)); 4 5 struct S { 6 constexpr int f(); // expected-warning {{C++14}} 7 constexpr int g() const; 8 constexpr int h(); // expected-warning {{C++14}} 9 int h(); 10 static constexpr int Sf(); 11 /*static*/ constexpr void *operator new(size_t) noexcept; 12 template<typename T> constexpr T tm(); // expected-warning {{C++14}} 13 template<typename T> static constexpr T ts(); 14 }; 15 f(const S & s)16void f(const S &s) { 17 s.f(); 18 s.g(); 19 20 int (*Sf)() = &S::Sf; 21 int (S::*f)() const = &S::f; 22 int (S::*g)() const = &S::g; 23 void *(*opNew)(size_t) = &S::operator new; 24 int (S::*tm)() const = &S::tm; 25 int (*ts)() = &S::ts; 26 } 27 f() const28constexpr int S::f() const { return 0; } g()29constexpr int S::g() { return 1; } // expected-warning {{C++14}} h()30constexpr int S::h() { return 0; } // expected-warning {{C++14}} h()31int S::h() { return 0; } Sf()32constexpr int S::Sf() { return 2; } operator new(size_t)33constexpr void *S::operator new(size_t) noexcept { return 0; } tm()34template<typename T> constexpr T S::tm() { return T(); } // expected-warning {{C++14}} ts()35template<typename T> constexpr T S::ts() { return T(); } 36 37 namespace std_example { 38 39 class debug_flag { 40 public: 41 explicit debug_flag(bool); 42 constexpr bool is_on() const; // ok (dr1684) 43 private: 44 bool flag; 45 }; 46 bar(int x,int y)47 constexpr int bar(int x, int y) // expected-note {{here}} 48 { return x + y + x*y; } bar(int x,int y)49 int bar(int x, int y) // expected-error {{non-constexpr declaration of 'bar' follows constexpr declaration}} 50 { return x * 2 + 3 * y; } 51 52 } 53 54 // The constexpr specifier is allowed for static member functions of non-literal types. 55 class NonLiteralClass { 56 NonLiteralClass(bool); 57 static constexpr bool isDebugFlag(); 58 }; 59