Home | History | Annotate | Download | only in dcl.constexpr
      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();
      7   constexpr int g() const;
      8   constexpr int h();
      9   int h();
     10   static constexpr int Sf();
     11   /*static*/ constexpr void *operator new(size_t) noexcept;
     12   template<typename T> constexpr T tm();
     13   template<typename T> static constexpr T ts();
     14 };
     15 
     16 void 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 
     28 constexpr int S::f() const { return 0; }
     29 constexpr int S::g() { return 1; }
     30 constexpr int S::h() { return 0; }
     31 int S::h() { return 0; }
     32 constexpr int S::Sf() { return 2; }
     33 constexpr void *S::operator new(size_t) noexcept { return 0; }
     34 template<typename T> constexpr T S::tm() { return T(); }
     35 template<typename T> constexpr T S::ts() { return T(); }
     36 
     37 namespace std_example {
     38 
     39   class debug_flag { // expected-note {{not an aggregate and has no constexpr constructors}}
     40   public:
     41     explicit debug_flag(bool);
     42     constexpr bool is_on(); // expected-error {{non-literal type 'std_example::debug_flag' cannot have constexpr members}}
     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.
     55 class NonLiteralClass {
     56   NonLiteralClass(bool);
     57   static constexpr bool isDebugFlag();
     58 };
     59