1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2 3using size_t = decltype(sizeof(int)); 4 5struct 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 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 28constexpr int S::f() const { return 0; } 29constexpr int S::g() { return 1; } // expected-warning {{C++14}} 30constexpr int S::h() { return 0; } // expected-warning {{C++14}} 31int S::h() { return 0; } 32constexpr int S::Sf() { return 2; } 33constexpr void *S::operator new(size_t) noexcept { return 0; } 34template<typename T> constexpr T S::tm() { return T(); } // expected-warning {{C++14}} 35template<typename T> constexpr T S::ts() { return T(); } 36 37namespace 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 47 constexpr int bar(int x, int y) // expected-note {{here}} 48 { return x + y + x*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. 55class NonLiteralClass { 56 NonLiteralClass(bool); 57 static constexpr bool isDebugFlag(); 58}; 59