summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/constant-expression-cxx11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/SemaCXX/constant-expression-cxx11.cpp')
-rw-r--r--clang/test/SemaCXX/constant-expression-cxx11.cpp53
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];
+}
OpenPOWER on IntegriCloud