summaryrefslogtreecommitdiff
path: root/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p8.cpp
blob: c4935b34a062d6cd9e9187d2c357fc92c87cfc17 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s

struct S {
  constexpr int f();
  constexpr int g() const;
  static constexpr int Sf();
};

void f(const S &s) {
  s.f();
  s.g();

  int (*f)() = &S::Sf;
  int (S::*g)() const = &S::g;
}

namespace std_example {

  class debug_flag { // expected-note {{not an aggregate and has no constexpr constructors}}
  public:
    explicit debug_flag(bool);
    constexpr bool is_on(); // expected-error {{non-literal type 'std_example::debug_flag' cannot have constexpr members}}
  private:
    bool flag;
  };

  constexpr int bar(int x, int y) // expected-note {{here}}
    { return x + y + x*y; }
  int bar(int x, int y) // expected-error {{non-constexpr declaration of 'bar' follows constexpr declaration}}
    { return x * 2 + 3 * y; }

}

// The constexpr specifier is allowed for static member functions of non-literal types.
class NonLiteralClass {
  NonLiteralClass(bool);
  static constexpr bool isDebugFlag();
};