diff options
| author | Daniel Jasper <djasper@google.com> | 2017-05-02 19:21:42 +0000 |
|---|---|---|
| committer | Daniel Jasper <djasper@google.com> | 2017-05-02 19:21:42 +0000 |
| commit | ffdee093504d8e4133ebc90855e13f87c94d82b1 (patch) | |
| tree | 7c95d85741a8d2d0d08b9050773b4fea7dcd1203 /clang/test/SemaCXX/constexpr-array-unknown-bound.cpp | |
| parent | f9d8eee3db46db293afea65a50bf884580873627 (diff) | |
| download | bcm5719-llvm-ffdee093504d8e4133ebc90855e13f87c94d82b1.tar.gz bcm5719-llvm-ffdee093504d8e4133ebc90855e13f87c94d82b1.zip | |
Revert r301822 (and dependent r301825), which tried to improve the
handling of constexprs with unknown bounds.
This triggers a corner case of the language where it's not yet clear
whether this should be an error:
struct A {
static void *const a[];
static void *const b[];
};
constexpr void *A::a[] = {&b[0]};
constexpr void *A::b[] = {&a[0]};
When discovering the initializer for A::a, the bounds of A::b aren't known yet.
It is unclear whether warning about errors should be deferred until the end of
the translation unit, possibly resolving errors that can be resolved. In
practice, the compiler can know the bounds of all arrays in this example.
Credits for reproducers and explanation go to Richard Smith. Richard, please
add more info in case my explanation is wrong.
llvm-svn: 301963
Diffstat (limited to 'clang/test/SemaCXX/constexpr-array-unknown-bound.cpp')
| -rw-r--r-- | clang/test/SemaCXX/constexpr-array-unknown-bound.cpp | 25 |
1 files changed, 0 insertions, 25 deletions
diff --git a/clang/test/SemaCXX/constexpr-array-unknown-bound.cpp b/clang/test/SemaCXX/constexpr-array-unknown-bound.cpp deleted file mode 100644 index 1d146237198..00000000000 --- a/clang/test/SemaCXX/constexpr-array-unknown-bound.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// 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}} -} |

