llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Joseph Huber (jhuber6) <details> <summary>Changes</summary> Summary: Some attributes have gnu extensions that share names with clang attributes. If these imply the same thing, we can specially declare this to be an alternate but equivalent spelling. Discussions welcome on whether or not we want to bind ourselves to GNU behavior, since theoretically it's possible for GNU to silently change the semantics away from our implementation, but I'm not an expert. Fixes: https://github.com/llvm/llvm-project/issues/125760 --- Full diff: https://github.com/llvm/llvm-project/pull/125796.diff 3 Files Affected: - (modified) clang/include/clang/Basic/Attr.td (+9-1) - (modified) clang/test/SemaCXX/attr-no-sanitize.cpp (+2-2) - (modified) clang/utils/TableGen/ClangAttrEmitter.cpp (+8) ``````````diff diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 2a3a29bd2ee1cf..bf746c2da51299 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -380,6 +380,14 @@ class Clang<string name, bit allowInC = 1, int version = 1> bit AllowInC = allowInC; } +// The Clang spelling implies GNU<name>, CXX11<"clang", name>, and optionally, +// C23<"clang", name>. This spelling should be used for any Clang-specific +// attributes. +class ClangGCC<string name, bit allowInC = 1, int version = 1> + : Spelling<name, "ClangGCC", version> { + bit AllowInC = allowInC; +} + // HLSL Annotation spellings class HLSLAnnotation<string name> : Spelling<name, "HLSLAnnotation">; @@ -3677,7 +3685,7 @@ def X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr<TargetAnyX86> } def NoSanitize : InheritableAttr { - let Spellings = [Clang<"no_sanitize">]; + let Spellings = [ClangGCC<"no_sanitize">]; let Args = [VariadicStringArgument<"Sanitizers">]; let Subjects = SubjectList<[Function, ObjCMethod, GlobalVar], ErrorDiag>; let Documentation = [NoSanitizeDocs]; diff --git a/clang/test/SemaCXX/attr-no-sanitize.cpp b/clang/test/SemaCXX/attr-no-sanitize.cpp index 8951f616ce0f05..cd60e71963ac30 100644 --- a/clang/test/SemaCXX/attr-no-sanitize.cpp +++ b/clang/test/SemaCXX/attr-no-sanitize.cpp @@ -21,8 +21,8 @@ int f3() __attribute__((no_sanitize("address"))); // DUMP-LABEL: FunctionDecl {{.*}} f4 // DUMP: NoSanitizeAttr {{.*}} hwaddress -// PRINT: {{\[\[}}clang::no_sanitize("hwaddress")]] int f4() -[[clang::no_sanitize("hwaddress")]] int f4(); +// PRINT: {{\[\[}}gnu::no_sanitize("hwaddress")]] int f4() +[[gnu::no_sanitize("hwaddress")]] int f4(); // DUMP-LABEL: FunctionDecl {{.*}} f5 // DUMP: NoSanitizeAttr {{.*}} address thread hwaddress diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index de12c7062666a4..af7478b7986f92 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -108,6 +108,14 @@ GetFlattenedSpellings(const Record &Attr) { Ret.emplace_back("CXX11", Name, "clang", false, *Spelling); if (Spelling->getValueAsBit("AllowInC")) Ret.emplace_back("C23", Name, "clang", false, *Spelling); + } else if (Variety == "ClangGCC") { + Ret.emplace_back("GNU", Name, "", false, *Spelling); + Ret.emplace_back("CXX11", Name, "clang", false, *Spelling); + Ret.emplace_back("CXX11", Name, "gnu", false, *Spelling); + if (Spelling->getValueAsBit("AllowInC")) { + Ret.emplace_back("C23", Name, "clang", false, *Spelling); + Ret.emplace_back("C23", Name, "gnu", false, *Spelling); + } } else { Ret.push_back(FlattenedSpelling(*Spelling)); } `````````` </details> https://github.com/llvm/llvm-project/pull/125796 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits