| // RUN: %clang_cc1 -fsyntax-only -verify %s |
| // XFAIL: * |
| |
| struct notlit { |
| notlit() {} |
| }; |
| struct notlit2 { |
| notlit2() {} |
| }; |
| |
| // valid declarations |
| constexpr int i1 = 0; |
| constexpr int f1() { return 0; } |
| struct s1 { |
| constexpr static int mi = 0; |
| }; |
| |
| // invalid declarations |
| // not a definition of an object |
| constexpr extern int i2; // x |
| // not a literal type |
| constexpr notlit nl1; // x |
| // function parameters |
| void f2(constexpr int i) {} // x |
| // non-static member |
| struct s2 { |
| constexpr int mi; // x |
| }; |
| // redeclaration mismatch |
| constexpr int f3(); // n |
| int f3(); // x |
| int f4(); // n |
| constexpr int f4(); // x |
| |
| // template stuff |
| template <typename T> |
| constexpr T ft(T t) { return t; } |
| |
| // specialization can differ in constepxr |
| template <> |
| notlit ft(notlit nl) { return nl; } |
| |
| constexpr int i3 = ft(1); |
| |
| void test() { |
| // ignore constexpr when instantiating with non-literal |
| notlit2 nl2; |
| (void)ft(nl2); |
| } |
| |
| // Examples from the standard: |
| constexpr int square(int x); |
| constexpr int bufsz = 1024; |
| |
| constexpr struct pixel { // x |
| int x; |
| int y; |
| constexpr pixel(int); |
| }; |
| |
| constexpr pixel::pixel(int a) |
| : x(square(a)), y(square(a)) |
| { } |
| |
| constexpr pixel small(2); // x (no definition of square(int) yet, so can't |
| // constexpr-eval pixel(int)) |
| |
| constexpr int square(int x) { |
| return x * x; |
| } |
| |
| constexpr pixel large(4); // now valid |
| |
| int next(constexpr int x) { // x |
| return x + 1; |
| } |
| |
| extern constexpr int memsz; // x |