[clang] Diagnose potential size confusion with VLA params (PR #129772)

Martin Uecker via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 4 22:11:51 PST 2025


================
@@ -0,0 +1,68 @@
+// RUN: %clang_cc1 %s -std=c23 -verify=expected,c -fsyntax-only
+// RUN: %clang_cc1 %s -std=c23 -verify=good -fsyntax-only -Wno-vla
+// RUN: %clang_cc1 -x c++ %s -verify -fsyntax-only
+// RUN: %clang_cc1 -DCARET -fsyntax-only -std=c23 -fno-diagnostics-show-line-numbers -fcaret-diagnostics-max-lines=1 %s 2>&1 | FileCheck %s -strict-whitespace
+
+// good-no-diagnostics
+
+int n, m;      // #decl
+int size(int);
+
+void foo(int vla[n], int n); // expected-warning {{variable length array size expression refers to declaration from an outer scope}} \
+                                expected-note {{does not refer to this declaration}} \
+                                expected-note@#decl {{refers to this declaration instead}}
+
+void bar(int (*vla)[n], int n); // expected-warning {{variable length array size expression refers to declaration from an outer scope}} \
+                                   expected-note {{does not refer to this declaration}} \
+                                   expected-note@#decl {{refers to this declaration instead}}
+
+void baz(int n, int vla[n]); // no diagnostic expected
+
+void quux(int vla[n + 12], int n); // expected-warning {{variable length array size expression refers to declaration from an outer scope}} \
+                                      expected-note {{does not refer to this declaration}} \
+                                      expected-note@#decl {{refers to this declaration instead}}
+
+void quibble(int vla[size(n)], int n);  // expected-warning {{variable length array size expression refers to declaration from an outer scope}} \
+                                           expected-note {{does not refer to this declaration}} \
+                                           expected-note@#decl {{refers to this declaration instead}}
+
+void quobble(int vla[n + m], int n, int m);  // expected-warning 2 {{variable length array size expression refers to declaration from an outer scope}} \
+                                                expected-note 2 {{does not refer to this declaration}} \
+                                                expected-note@#decl 2 {{refers to this declaration instead}}
+
+// For const int, we still treat the function as having a variably-modified
+// type, but only in C.
----------------
uecker wrote:

Note that there is proposal in flight for C that might change this.


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


More information about the cfe-commits mailing list