[clang] [clang][Interp] Fix diagnosing non-const variables pre-C++11 (PR #76718)

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 15 05:35:26 PST 2024


================
@@ -0,0 +1,36 @@
+// RUN: %clang_cc1 -fexperimental-new-constant-interpreter -verify=both,expected -std=c++98 %s
+// RUN: %clang_cc1 -verify=both,ref -std=c++98 %s
+
+
+
+namespace IntOrEnum {
+  const int k = 0;
+  const int &p = k; // both-note {{declared here}}
+  template<int n> struct S {};
+  S<p> s; // both-error {{not an integral constant expression}} \
+          // both-note {{read of variable 'p' of non-integral, non-enumeration type 'const int &'}}
+}
+
+const int cval = 2;
+template <int> struct C{};
+template struct C<cval>;
+
+
+/// FIXME: This example does not get properly diagnosed in the new interpreter.
+extern const int recurse1;
+const int recurse2 = recurse1; // ref-note {{here}}
+const int recurse1 = 1;
+int array1[recurse1];
+int array2[recurse2]; // ref-warning 2{{variable length array}} \
+                      // ref-note {{initializer of 'recurse2' is not a constant expression}} \
+                      // expected-warning {{variable length array}} \
+                      // expected-error {{variable length array}}
+
+int NCI; // expected-note {{declared here}} \
+         // ref-note {{declared here}}
+int NCIA[NCI]; // expected-warning {{variable length array}} \
+               // expected-error {{variable length array}} \\
+               // expected-note {{read of non-const variable 'NCI'}} \
+               // ref-warning {{variable length array}} \
+               // ref-error {{variable length array}} \\
+               // ref-note {{read of non-const variable 'NCI'}}
----------------
AaronBallman wrote:

Switch these to using `both` instead?

https://github.com/llvm/llvm-project/pull/76718


More information about the cfe-commits mailing list