diff options
Diffstat (limited to 'clang/test/SemaCXX/constant-expression-cxx11.cpp')
-rw-r--r-- | clang/test/SemaCXX/constant-expression-cxx11.cpp | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index fdab2838937..4ecc53c61b8 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -1,6 +1,17 @@ // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -template<typename T> constexpr T id(const T &t) { return t; } +// FIXME: support const T& parameters here. +//template<typename T> constexpr T id(const T &t) { return t; } +template<typename T> constexpr T id(T t) { return t; } +// FIXME: support templates here. +//template<typename T> constexpr T min(const T &a, const T &b) { +// return a < b ? a : b; +//} +//template<typename T> constexpr T max(const T &a, const T &b) { +// return a < b ? b : a; +//} +constexpr int min(int a, int b) { return a < b ? a : b; } +constexpr int max(int a, int b) { return a < b ? b : a; } struct MemberZero { constexpr int zero() { return 0; } @@ -40,3 +51,43 @@ namespace MemberEnum { constexpr bool b = wme.A == 42; int n[b]; } + +namespace Recursion { + constexpr int fib(int n) { return n > 1 ? fib(n-1) + fib(n-2) : n; } + // FIXME: this isn't an ICE yet. + using check_fib = int[fib(11)]; + using check_fib = int[89]; + + constexpr int gcd_inner(int a, int b) { + return b == 0 ? a : gcd_inner(b, a % b); + } + constexpr int gcd(int a, int b) { + return gcd_inner(max(a, b), min(a, b)); + } + + // FIXME: this isn't an ICE yet. + using check_gcd = int[gcd(1749237, 5628959)]; + using check_gcd = int[7]; +} + +namespace FunctionCast { + // When folding, we allow functions to be cast to different types. Such + // cast functions cannot be called, even if they're constexpr. + constexpr int f() { return 1; } + typedef double (*DoubleFn)(); + typedef int (*IntFn)(); + int a[(int)DoubleFn(f)()]; // expected-error {{variable length array}} + int b[(int)IntFn(f)()]; // ok +} + +namespace StaticMemberFunction { + struct S { + static constexpr int k = 42; + static constexpr int f(int n) { return n * k + 2; } + } s; + // FIXME: this isn't an ICE yet. + using check_static_call = int[S::f(19)]; + constexpr int n = s.f(19); + using check_static_call = int[s.f(19)]; + using check_static_call = int[800]; +} |