[clang] [Clang] restrict use of attribute names reserved by the C++ standard (PR #106036)

Oleksandr T. via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 28 05:49:03 PDT 2024


https://github.com/a-tarasyuk updated https://github.com/llvm/llvm-project/pull/106036

>From 67e70c3abc2527d2f35abdc10ce2710dd9ebb918 Mon Sep 17 00:00:00 2001
From: Oleksandr T <oleksandr.tarasiuk at outlook.com>
Date: Mon, 26 Aug 2024 07:37:04 +0300
Subject: [PATCH] [Clang] restrict use of attribute names reserved by the C++
 standard

---
 clang/docs/ReleaseNotes.rst                   |  2 ++
 clang/lib/Lex/PPDirectives.cpp                | 22 +++++++++++++
 .../Preprocessor/macro-reserved-attrs.cpp     | 33 +++++++++++++++++++
 3 files changed, 57 insertions(+)
 create mode 100644 clang/test/Preprocessor/macro-reserved-attrs.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 2c6c7e083b9c91..b8b76eb0ff380c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -254,6 +254,8 @@ Improvements to Clang's diagnostics
   compilation speed with modules. This warning is disabled by default and it needs
   to be explicitly enabled or by ``-Weverything``.
 
+- Clang now diagnoses the use of attribute names reserved by the C++ standard. (#GH92196).
+
 Improvements to Clang's time-trace
 ----------------------------------
 
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 4e77df9ec444c7..bbe1b4a640c4ac 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -177,6 +177,26 @@ static bool isLanguageDefinedBuiltin(const SourceManager &SourceMgr,
   return false;
 }
 
+static bool isReservedAttrName(Preprocessor &PP, IdentifierInfo *II) {
+  const LangOptions &Lang = PP.getLangOpts();
+  const StringRef Name = II->getName();
+
+  if (Lang.CPlusPlus26)
+    return Name == "indeterminate";
+  if (Lang.CPlusPlus23)
+    return Name == "assume";
+  if (Lang.CPlusPlus20)
+    return Name == "no_unique_address";
+  if (Lang.CPlusPlus17)
+    return Name == "fallthrough" || Name == "nodiscard" ||
+           Name == "maybe_unused";
+  if (Lang.CPlusPlus14)
+    return Name == "deprecated";
+  if (Lang.CPlusPlus11)
+    return Name == "noreturn" || Name == "carries_dependency";
+  return false;
+}
+
 static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
   const LangOptions &Lang = PP.getLangOpts();
   StringRef Text = II->getName();
@@ -186,6 +206,8 @@ static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
     return MD_KeywordDef;
   if (Lang.CPlusPlus11 && (Text == "override" || Text == "final"))
     return MD_KeywordDef;
+  if (isReservedAttrName(PP, II))
+    return MD_KeywordDef;
   return MD_NoWarn;
 }
 
diff --git a/clang/test/Preprocessor/macro-reserved-attrs.cpp b/clang/test/Preprocessor/macro-reserved-attrs.cpp
new file mode 100644
index 00000000000000..b4336f801e438a
--- /dev/null
+++ b/clang/test/Preprocessor/macro-reserved-attrs.cpp
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx11 -pedantic -std=c++11 %s
+// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx14 -pedantic -std=c++14 %s
+// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx17 -pedantic -std=c++17 %s
+// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx20 -pedantic -std=c++20 %s
+// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx23 -pedantic -std=c++23 %s
+// RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx26 -pedantic -std=c++26 %s
+
+#define noreturn 1           // cxx11-warning {{keyword is hidden by macro definition}}
+#undef noreturn
+
+#define carries_dependency 1 // cxx11-warning {{keyword is hidden by macro definition}}
+#undef carries_dependency
+
+#define deprecated 1         // cxx14-warning {{keyword is hidden by macro definition}}
+#undef deprecated
+
+#define fallthrough 1        // cxx17-warning {{keyword is hidden by macro definition}}
+#undef fallthrough
+
+#define maybe_unused 1       // cxx17-warning {{keyword is hidden by macro definition}}
+#undef maybe_unused
+
+#define nodiscard 1          // cxx17-warning {{keyword is hidden by macro definition}}
+#undef nodiscard
+
+#define no_unique_address 1  // cxx20-warning {{keyword is hidden by macro definition}}
+#undef no_unique_address
+
+#define assume 1             // cxx23-warning {{keyword is hidden by macro definition}}
+#undef assume
+
+#define indeterminate 1      // cxx26-warning {{keyword is hidden by macro definition}}
+#undef indeterminate



More information about the cfe-commits mailing list