summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-05-06 05:56:11 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-05-06 05:56:11 +0000
commit4e18ca520071a5c6fe07e53d1e1c5cda9b768dce (patch)
tree7698557f220f6a9255479e6acd010086c65e1218 /clang/test
parentb07a68ebb0fa72af77b025842159240f569dcc17 (diff)
downloadbcm5719-llvm-4e18ca520071a5c6fe07e53d1e1c5cda9b768dce.tar.gz
bcm5719-llvm-4e18ca520071a5c6fe07e53d1e1c5cda9b768dce.zip
C++1y: support 'for', 'while', and 'do ... while' in constant expressions.
llvm-svn: 181181
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp8
-rw-r--r--clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp4
-rw-r--r--clang/test/SemaCXX/constant-expression-cxx1y.cpp91
3 files changed, 71 insertions, 32 deletions
diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp
index 3bc639dd571..4393727c193 100644
--- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp
+++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp
@@ -143,10 +143,6 @@ constexpr int ForStmt() {
for (int n = 0; n < 10; ++n)
#ifndef CXX1Y
// expected-error@-2 {{statement not allowed in constexpr function}}
-#else
- // FIXME: Once we support evaluating a for-statement, this diagnostic should disappear.
- // expected-error@-6 {{never produces a constant expression}}
- // expected-note@-6 {{subexpression}}
#endif
return 0;
}
@@ -289,9 +285,5 @@ namespace std_example {
#ifndef CXX1Y
// expected-error@-5 {{C++1y}}
// expected-error@-5 {{statement not allowed}}
-#else
- // FIXME: This should be allowed.
- // expected-error@-10 {{never produces a constant}}
- // expected-note@-9 {{subexpression}}
#endif
}
diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp
index 820a02a5e03..8a4fa42f002 100644
--- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp
+++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp
@@ -87,10 +87,6 @@ struct V {
/**/;
#ifndef CXX1Y
// expected-error@-3 {{statement not allowed in constexpr constructor}}
-#else
- // FIXME: Once we support evaluating a for-statement, this diagnostic should disappear.
- // expected-error@-7 {{never produces a constant expression}}
- // expected-note@-7 {{subexpression}}
#endif
}
constexpr V(int(&)[2]) {
diff --git a/clang/test/SemaCXX/constant-expression-cxx1y.cpp b/clang/test/SemaCXX/constant-expression-cxx1y.cpp
index 2dfded4cc34..d8cfb1c2974 100644
--- a/clang/test/SemaCXX/constant-expression-cxx1y.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx1y.cpp
@@ -156,33 +156,14 @@ namespace string_assign {
}
template<typename Iterator>
constexpr void reverse(Iterator begin, Iterator end) {
-#if 0 // FIXME: once implementation is complete...
while (begin != end && begin != --end)
swap(*begin++, *end);
-#else
- if (begin != end) {
- if (begin == --end)
- return;
- swap(*begin++, *end);
- reverse(begin, end);
- }
-#endif
}
template<typename Iterator1, typename Iterator2>
constexpr bool equal(Iterator1 a, Iterator1 ae, Iterator2 b, Iterator2 be) {
-#if 0 // FIXME: once implementation is complete...
- while (a != ae && b != be) {
- if (*a != *b)
- return false;
- ++a, ++b;
- }
-#else
- if (a != ae && b != be) {
+ while (a != ae && b != be)
if (*a++ != *b++)
return false;
- return equal(a, ae, b, be);
- }
-#endif
return a == ae && b == be;
}
constexpr bool test1(int n) {
@@ -352,3 +333,73 @@ namespace incdec {
}
static_assert(incr(0) == 101, "");
}
+
+namespace loops {
+ constexpr int fib_loop(int a) {
+ int f_k = 0, f_k_plus_one = 1;
+ for (int k = 1; k != a; ++k) {
+ int f_k_plus_two = f_k + f_k_plus_one;
+ f_k = f_k_plus_one;
+ f_k_plus_one = f_k_plus_two;
+ }
+ return f_k_plus_one;
+ }
+ static_assert(fib_loop(46) == 1836311903, "");
+
+ constexpr bool breaks_work() {
+ int a = 0;
+ for (int n = 0; n != 100; ++n) {
+ ++a;
+ if (a == 5) continue;
+ if ((a % 5) == 0) break;
+ }
+
+ int b = 0;
+ while (b != 17) {
+ ++b;
+ if (b == 6) continue;
+ if ((b % 6) == 0) break;
+ }
+
+ int c = 0;
+ do {
+ ++c;
+ if (c == 7) continue;
+ if ((c % 7) == 0) break;
+ } while (c != 21);
+
+ return a == 10 && b == 12 & c == 14;
+ }
+ static_assert(breaks_work(), "");
+
+ void not_constexpr();
+ constexpr bool no_cont_after_break() {
+ for (;;) {
+ break;
+ not_constexpr();
+ }
+ while (true) {
+ break;
+ not_constexpr();
+ }
+ do {
+ break;
+ not_constexpr();
+ } while (true);
+ return true;
+ }
+ static_assert(no_cont_after_break(), "");
+
+ constexpr bool cond() {
+ for (int a = 1; bool b = a != 3; ++a) {
+ if (!b)
+ return false;
+ }
+ while (bool b = true) {
+ b = false;
+ break;
+ }
+ return true;
+ }
+ static_assert(cond(), "");
+}
OpenPOWER on IntegriCloud