[clang] [clang] Add an ABI_EXTENSION concept that is testable under -pedantic… (PR #153506)

Oliver Hunt via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 13 16:17:11 PDT 2025


https://github.com/ojhunt created https://github.com/llvm/llvm-project/pull/153506

…-errors

This is a targeted change to allow us to specify that an extension test should return true even if -pedantic-errors is enabled.

In the longer term we may want to consider changing the behavior of -pedantic-errors to not gate __has_extension checks, and become more in line with `-Wpedantic -Werror`.

>From 6a2fe6deb5fb5f5505cade16f0b0a0349c582df4 Mon Sep 17 00:00:00 2001
From: Oliver Hunt <oliver at apple.com>
Date: Wed, 13 Aug 2025 16:13:44 -0700
Subject: [PATCH] [clang] Add an ABI_EXTENSION concept that is testable under
 -pedantic-errors

This is a targeted change to allow us to specify that an extension
test should return true even if -pedantic-errors is enabled.

In the longer term we may want to consider changing the behavior of
-pedantic-errors to not gate __has_extension checks, and become more
in line with `-Wpedantic -Werror`.
---
 clang/include/clang/Basic/Features.def | 11 ++++++++---
 clang/lib/Frontend/FrontendActions.cpp |  6 +++++-
 clang/lib/Lex/PPMacroExpansion.cpp     | 21 ++++++++++++++-------
 clang/test/Sema/ptrauth-qualifier.c    |  1 +
 4 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def
index c58e3f2400adc..04ed820b4213a 100644
--- a/clang/include/clang/Basic/Features.def
+++ b/clang/include/clang/Basic/Features.def
@@ -24,8 +24,8 @@
 //
 //===----------------------------------------------------------------------===//
 
-#if !defined(FEATURE) && !defined(EXTENSION)
-#  error Define either the FEATURE or EXTENSION macro to handle features
+#if !defined(FEATURE) && !defined(EXTENSION) && !defined(ABI_EXTENSION)
+#  error Define either the FEATURE, EXTENSION, or ABI_EXTENSION macro to handle features
 #endif
 
 #ifndef FEATURE
@@ -36,6 +36,10 @@
 #define EXTENSION(Name, Predicate)
 #endif
 
+#ifndef ABI_EXTENSION
+#define ABI_EXTENSION(Name, Predicate)
+#endif
+
 FEATURE(speculative_load_hardening, LangOpts.SpeculativeLoadHardening)
 FEATURE(address_sanitizer,
         LangOpts.Sanitize.hasOneOf(SanitizerKind::Address |
@@ -148,7 +152,7 @@ FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread))
 FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow))
 FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo))
 FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics)
-EXTENSION(ptrauth_qualifier, LangOpts.PointerAuthIntrinsics)
+ABI_EXTENSION(ptrauth_qualifier, LangOpts.PointerAuthIntrinsics)
 FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls)
 FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns)
 FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtrAddressDiscrimination)
@@ -385,3 +389,4 @@ EXTENSION(cxx_type_aware_allocators, true)
 
 #undef EXTENSION
 #undef FEATURE
+#undef ABI_EXTENSION
diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp
index 685a9bbf2cde9..c925e1f8a1331 100644
--- a/clang/lib/Frontend/FrontendActions.cpp
+++ b/clang/lib/Frontend/FrontendActions.cpp
@@ -1183,11 +1183,15 @@ void DumpCompilerOptionsAction::ExecuteAction() {
   OS << "\n\"extensions\" : [\n";
   {
     llvm::SmallString<128> Str;
-#define EXTENSION(Name, Predicate)                                             \
+#define EXTENSION_OPTION(Name, Predicate)                                          \
   ("\t{\"" #Name "\" : " + llvm::Twine(Predicate ? "true" : "false") + "},\n") \
       .toVector(Str);
+#define EXTENSION(Name, Predicate) EXTENSION_OPTION(Name, Predicate)
+#define ABI_EXTENSION(Name, Predicate) EXTENSION_OPTION(Name, Predicate)
 #include "clang/Basic/Features.def"
 #undef EXTENSION
+#undef ABI_EXTENSION
+#undef EXTENSION_OPTION
     // Remove the newline and comma from the last entry to ensure this remains
     // valid JSON.
     OS << Str.substr(0, Str.size() - 2);
diff --git a/clang/lib/Lex/PPMacroExpansion.cpp b/clang/lib/Lex/PPMacroExpansion.cpp
index 6f12ac80d677e..7cae6acc081c0 100644
--- a/clang/lib/Lex/PPMacroExpansion.cpp
+++ b/clang/lib/Lex/PPMacroExpansion.cpp
@@ -1109,19 +1109,26 @@ static bool HasExtension(const Preprocessor &PP, StringRef Extension) {
   if (HasFeature(PP, Extension))
     return true;
 
+  // Normalize the extension name, __foo__ becomes foo.
+  if (Extension.starts_with("__") && Extension.ends_with("__") &&
+      Extension.size() >= 4)
+    Extension = Extension.substr(2, Extension.size() - 4);
+
+  const LangOptions &LangOpts = PP.getLangOpts();
+#define ABI_EXTENSION(Name, Predicate) .Case(#Name, Predicate)
+  bool IsABIExtension = llvm::StringSwitch<bool>(Extension)
+#include "clang/Basic/Features.def"
+      .Default(false);
+#undef ABI_EXTENSION
+  if (IsABIExtension)
+    return true;
+
   // If the use of an extension results in an error diagnostic, extensions are
   // effectively unavailable, so just return false here.
   if (PP.getDiagnostics().getExtensionHandlingBehavior() >=
       diag::Severity::Error)
     return false;
 
-  const LangOptions &LangOpts = PP.getLangOpts();
-
-  // Normalize the extension name, __foo__ becomes foo.
-  if (Extension.starts_with("__") && Extension.ends_with("__") &&
-      Extension.size() >= 4)
-    Extension = Extension.substr(2, Extension.size() - 4);
-
     // Because we inherit the feature list from HasFeature, this string switch
     // must be less restrictive than HasFeature's.
 #define EXTENSION(Name, Predicate) .Case(#Name, Predicate)
diff --git a/clang/test/Sema/ptrauth-qualifier.c b/clang/test/Sema/ptrauth-qualifier.c
index 5d932b724f07a..358666025fca5 100644
--- a/clang/test/Sema/ptrauth-qualifier.c
+++ b/clang/test/Sema/ptrauth-qualifier.c
@@ -1,5 +1,6 @@
 // RUN: %clang_cc1 -triple arm64-apple-ios -std=c23 -fsyntax-only -verify -fptrauth-intrinsics %s
 // RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c23 -fsyntax-only -verify -fptrauth-intrinsics %s
+// RUN: %clang_cc1 -triple aarch64-linux-gnu -std=c23 -fsyntax-only -verify -fptrauth-intrinsics -pedantic-errors -Wno-c2y-extensions %s
 
 #if !__has_extension(ptrauth_qualifier)
 // This error means that the __ptrauth qualifier availability test says  that it



More information about the cfe-commits mailing list