[clang] c2fea4c - [C++] Fix parsing of _Alignas in local declarations (#81915)

via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 16 04:43:59 PST 2024


Author: Aaron Ballman
Date: 2024-02-16T07:43:55-05:00
New Revision: c2fea4cf38991669030f4190d17b645cec27a7c0

URL: https://github.com/llvm/llvm-project/commit/c2fea4cf38991669030f4190d17b645cec27a7c0
DIFF: https://github.com/llvm/llvm-project/commit/c2fea4cf38991669030f4190d17b645cec27a7c0.diff

LOG: [C++] Fix parsing of _Alignas in local declarations (#81915)

We support '_Alignas' from C11 as an extension in C++. However, we were
not correctly parsing its use in local variable declarations. This patch
addresses that issue.

Added: 
    clang/test/SemaCXX/_Alignas.cpp

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Parse/ParseTentative.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 608d855abf5d06..16f79a349c20c8 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -259,6 +259,9 @@ Bug Fixes to C++ Support
   some of (`#80510 <https://github.com/llvm/llvm-project/issues/80510>`).
 - Clang now ignores top-level cv-qualifiers on function parameters in template partial orderings.
   (`#75404 <https://github.com/llvm/llvm-project/issues/75404>`_)
+- No longer reject valid use of the ``_Alignas`` specifier when declaring a
+  local variable, which is supported as a C11 extension in C++. Previously, it
+  was only accepted at namespace scope but not at local function scope.
 
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^

diff  --git a/clang/lib/Parse/ParseTentative.cpp b/clang/lib/Parse/ParseTentative.cpp
index 299e46f4be9a2c..ea17c3e3252ec2 100644
--- a/clang/lib/Parse/ParseTentative.cpp
+++ b/clang/lib/Parse/ParseTentative.cpp
@@ -1842,6 +1842,9 @@ Parser::isCXXDeclarationSpecifier(ImplicitTypenameContext AllowImplicitTypename,
 #include "clang/Basic/TransformTypeTraits.def"
     return TPResult::True;
 
+  // C11 _Alignas
+  case tok::kw__Alignas:
+    return TPResult::True;
   // C11 _Atomic
   case tok::kw__Atomic:
     return TPResult::True;

diff  --git a/clang/test/SemaCXX/_Alignas.cpp b/clang/test/SemaCXX/_Alignas.cpp
new file mode 100644
index 00000000000000..4e892745580ed6
--- /dev/null
+++ b/clang/test/SemaCXX/_Alignas.cpp
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify=expected,cpp
+// RUN: %clang_cc1 -x c %s -fsyntax-only -verify=expected,c
+
+// Ensure that we correctly parse _Alignas as an extension in C++.
+_Alignas(64) int i1;
+_Alignas(long long) int i2;
+int volatile _Alignas(64) i3; // Test strange ordering
+
+void foo(void) {
+  // We previously rejected these valid declarations.
+  _Alignas(8) char i4;
+  _Alignas(char) char i5;
+
+  (void)(int _Alignas(64))0; // expected-warning {{'_Alignas' attribute ignored when parsing type}}
+  // FIXME: C and C++ should both diagnose the same way, as being ignored.
+  (void)(_Alignas(64) int)0; // c-error {{expected expression}} \
+                                cpp-warning {{'_Alignas' attribute ignored when parsing type}}
+}
+
+struct S {
+  _Alignas(int) int i;
+  _Alignas(64) int j;
+};
+
+void bar(_Alignas(8) char c1, char _Alignas(char) c2); // expected-error 2 {{'_Alignas' attribute cannot be applied to a function parameter}}


        


More information about the cfe-commits mailing list