mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-24 22:08:57 -04:00

constant expressions. We permit array-to-pointer decay on such arrays, but disallow pointer arithmetic (since we do not know whether it will have defined behavior). This is based on r311970 and r301822 (the former by me and the latter by Robert Haberlach). Between then and now, two things have changed: we have committee feedback indicating that this is indeed the right direction, and the code broken by this change has been fixed. This is necessary in C++17 to continue accepting certain forms of non-type template argument involving arrays of unknown bound. llvm-svn: 316245
27 lines
1.1 KiB
C++
27 lines
1.1 KiB
C++
// 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({{.*}})'}}
|
|
|
|
// FIXME: consider permitting this case
|
|
struct A {int m[];} a;
|
|
constexpr auto p3 = a.m; // expected-error {{constant expression}} expected-note {{without known bound}}
|
|
constexpr auto p4 = a.m + 1; // expected-error {{constant expression}} expected-note {{without known bound}}
|
|
|
|
void g(int i) {
|
|
int arr[i];
|
|
constexpr auto *p = arr + 2; // expected-error {{constant expression}} expected-note {{without known 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}}
|
|
}
|