Origami404 updated this revision to Diff 477482.
Origami404 added a comment.

Update release notes.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D137343/new/

https://reviews.llvm.org/D137343

Files:
  clang/docs/ReleaseNotes.rst
  clang/include/clang/Basic/DiagnosticGroups.td
  clang/include/clang/Basic/DiagnosticSemaKinds.td
  clang/lib/Sema/SemaType.cpp
  clang/test/Sema/warn-vla.c

Index: clang/test/Sema/warn-vla.c
===================================================================
--- clang/test/Sema/warn-vla.c
+++ clang/test/Sema/warn-vla.c
@@ -1,12 +1,39 @@
-// RUN: %clang_cc1 -std=c99 -fsyntax-only -verify -Wvla %s
-// RUN: %clang_cc1 -std=c89 -fsyntax-only -verify -Wvla %s
+// RUN: %clang_cc1 -std=c99 -fsyntax-only -verify=expected,no-fallback-c99 -Wvla -Wvla-stack-allocation %s
+// RUN: %clang_cc1 -std=c89 -fsyntax-only -verify=expected,no-fallback-c89 -Wvla -Wvla-stack-allocation %s
+// RUN: %clang_cc1 -std=c99 -fsyntax-only -verify=expected,fallback -Wvla %s
+// RUN: %clang_cc1 -std=c99 -fsyntax-only -verify=expected,only-stack-allocation -Wvla-stack-allocation -Wno-vla %s
 
 void test1(int n) {
-  int v[n]; // expected-warning {{variable length array}}
+  int v[n]; /* no-fallback-c89-warning {{variable length arrays are a C99 feature}}
+               no-fallback-c99-warning {{variable length array that may require stack allocation used}}
+               fallback-warning {{variable length array used}}
+               only-stack-allocation-warning {{variable length array that may require stack allocation used}}
+            */
 }
 
-void test2(int n, int v[n]) { // expected-warning {{variable length array}}
+void test2(int n, int v[n]) { /* no-fallback-c89-warning {{variable length arrays are a C99 feature}}
+                                 no-fallback-c99-warning {{variable length array used}}
+                                 fallback-warning {{variable length array used}}
+                              */
 }
 
-void test3(int n, int v[n]); // expected-warning {{variable length array}}
+void test3(int n, int v[n]); /* no-fallback-c89-warning {{variable length arrays are a C99 feature}}
+                                no-fallback-c99-warning {{variable length array used}}
+                                fallback-warning {{variable length array used}}
+                              */
 
+int test4_num;
+typedef int Test4[test4_num]; /* no-fallback-c89-warning {{variable length arrays are a C99 feature}} 
+                                 no-fallback-c99-warning {{variable length array used}}
+                                 fallback-warning {{variable length array used}}
+                                 expected-error {{variable length array declaration not allowed at file scope}}
+                              */
+
+void test5() {
+  typedef int type[test4_num]; /* no-fallback-c89-warning {{variable length arrays are a C99 feature}} 
+                                  no-fallback-c99-warning {{variable length array that may require stack allocation used}}
+                                  fallback-warning {{variable length array used}}
+                                  only-stack-allocation-warning {{variable length array that may require stack allocation used}}
+                                */
+
+}
Index: clang/lib/Sema/SemaType.cpp
===================================================================
--- clang/lib/Sema/SemaType.cpp
+++ clang/lib/Sema/SemaType.cpp
@@ -22,6 +22,7 @@
 #include "clang/AST/Type.h"
 #include "clang/AST/TypeLoc.h"
 #include "clang/AST/TypeLocVisitor.h"
+#include "clang/Basic/DiagnosticSema.h"
 #include "clang/Basic/PartialDiagnostic.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/Specifiers.h"
@@ -2530,7 +2531,8 @@
     return QualType();
   }
 
-  // VLAs always produce at least a -Wvla diagnostic, sometimes an error.
+  // VLAs always produce at least a -Wvla-portability or -Wvla-stack-allocation
+  // diagnostic, sometimes an error.
   unsigned VLADiag;
   bool VLAIsError;
   if (getLangOpts().OpenCL) {
@@ -2538,7 +2540,26 @@
     VLADiag = diag::err_opencl_vla;
     VLAIsError = true;
   } else if (getLangOpts().C99) {
-    VLADiag = diag::warn_vla_used;
+    // after C99, VLA is no longer an extension.
+    if (getCurScope()->getFlags() == Scope::ScopeFlags::DeclScope) {
+      // VLA in file scope typedef will have an error, and should not have a
+      // warning of portability. But for backward compatibility, we preform the
+      // exact same action like before (which will give an warning of "vla
+      // used").
+      VLADiag = diag::warn_vla_portability;
+    } else if (getCurScope()->isFunctionPrototypeScope()) {
+      // VLA in function prototype is acceptable by C2x standard
+      // so just give a protability warning
+      VLADiag = diag::warn_vla_portability;
+    } else {
+      // in other case, a VLA will cause stack allocation
+      // if -Wvla-stack-allocation is ignored, fallback to
+      // -Wvla-protability
+      if (getDiagnostics().isIgnored(diag::warn_vla_stack_allocation, Loc))
+        VLADiag = diag::warn_vla_portability;
+      else
+        VLADiag = diag::warn_vla_stack_allocation;
+    }
     VLAIsError = false;
   } else if (isSFINAEContext()) {
     VLADiag = diag::err_vla_in_sfinae;
@@ -2547,6 +2568,7 @@
     VLADiag = diag::err_openmp_vla_in_task_untied;
     VLAIsError = true;
   } else {
+    // Before C99 and in most of platform, VLA is an extension.
     VLADiag = diag::ext_vla;
     VLAIsError = false;
   }
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -131,8 +131,10 @@
 // C99 variable-length arrays
 def ext_vla : Extension<"variable length arrays are a C99 feature">,
   InGroup<VLAExtension>;
-def warn_vla_used : Warning<"variable length array used">,
+def warn_vla_portability : Warning<"variable length array used">,
   InGroup<VLA>, DefaultIgnore;
+def warn_vla_stack_allocation : Warning<"variable length array that may require stack allocation used">,
+  InGroup<VLAStackAllocation>, DefaultIgnore;
 def err_vla_in_sfinae : Error<
   "variable length array cannot be formed during template argument deduction">;
 def err_array_star_in_function_definition : Error<
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -828,6 +828,7 @@
 def VexingParse : DiagGroup<"vexing-parse">;
 def VLAExtension : DiagGroup<"vla-extension">;
 def VLA : DiagGroup<"vla", [VLAExtension]>;
+def VLAStackAllocation : DiagGroup<"vla-stack-allocation", [VLA]>;
 def VolatileRegisterVar : DiagGroup<"volatile-register-var">;
 def Visibility : DiagGroup<"visibility">;
 def ZeroLengthArray : DiagGroup<"zero-length-array">;
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -456,6 +456,17 @@
       int b[0]; // NOT a flexible array member.
     };
 
+- Added ``-Wvla-stack-allocation`` to only give warnings about VLA that need 
+  stack allocation.
+
+  .. code-block:: C
+
+    void f(int n) {
+      int a[n]; // VLA that needs stack allocation
+    }
+
+    void g(int n, int a[n]) {} // VLA that don't need stack allocation
+
 Deprecated Compiler Flags
 -------------------------
 - ``-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang``
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to