summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/constexpr-array-unknown-bound.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2017-05-01 18:49:04 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2017-05-01 18:49:04 +0000
commiteec904f849e2191fbe84dbbdae223c88dd66fa37 (patch)
treea8794a089b337df06880c413d9dd803bdd688bae /clang/test/SemaCXX/constexpr-array-unknown-bound.cpp
parentcfe4b5ca15ca2dc93c6f938fe18094e24701cd71 (diff)
downloadbcm5719-llvm-eec904f849e2191fbe84dbbdae223c88dd66fa37.tar.gz
bcm5719-llvm-eec904f849e2191fbe84dbbdae223c88dd66fa37.zip
Improve handling of arrays of unknown bound in constant expressions.
Do not spuriously reject constexpr functions that access elements of an array of unknown bound; this may later become valid once the bound is known. Permit array-to-pointer decay on such arrays, but disallow pointer arithmetic (since we do not know whether it will have defined behavior). The standard is not clear on how this should work, but this seems to be a decent answer. Patch by Robert Haberlach! llvm-svn: 301822
Diffstat (limited to 'clang/test/SemaCXX/constexpr-array-unknown-bound.cpp')
-rw-r--r--clang/test/SemaCXX/constexpr-array-unknown-bound.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/constexpr-array-unknown-bound.cpp b/clang/test/SemaCXX/constexpr-array-unknown-bound.cpp
new file mode 100644
index 00000000000..1d146237198
--- /dev/null
+++ b/clang/test/SemaCXX/constexpr-array-unknown-bound.cpp
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 %s -Wno-uninitialized -std=c++1z -fsyntax-only -verify
+
+const extern int arr[];
+constexpr auto p = arr; // ok
+constexpr int f(int i) {return p[i];} // expected-note {{read of dereferenced one-past-the-end pointer}}
+
+constexpr int arr[] {1, 2, 3};
+constexpr auto p2 = arr + 2; // ok
+constexpr int x = f(2); // ok
+constexpr int y = f(3); // expected-error {{constant expression}}
+// expected-note-re@-1 {{in call to 'f({{.*}})'}}
+
+struct A {int m[];} a;
+constexpr auto p3 = a.m; // ok
+constexpr auto p4 = a.m + 1; // expected-error {{constant expression}} expected-note {{constant bound}}
+
+void g(int i) {
+ int arr[i];
+ constexpr auto *p = arr + 2; // expected-error {{constant expression}} expected-note {{constant bound}}
+
+ // FIXME: Give a better diagnostic here. The issue is that computing
+ // sizeof(*arr2) within the array indexing fails due to the VLA.
+ int arr2[2][i];
+ constexpr int m = ((void)arr2[2], 0); // expected-error {{constant expression}}
+}
OpenPOWER on IntegriCloud