Issue 84372
Summary [clang] __has_extension changes semantics based on -pedantic-errors
Labels clang
Assignees
Reporter ldionne
    I just found this in `clang/docs/LanguageExtensions.rst:143`:

> If the `-pedantic-errors option is given, __has_extension` is equivalent to `__has_feature`.

And in `clang/lib/Lex/PPMacroExpansion.cpp:1161`:

```
static bool HasExtension(const Preprocessor &PP, StringRef Extension) {
  if (HasFeature(PP, Extension))
    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();

  ...
```

So basically, `__has_extension(...)` always returns `0` when `-pedantic-errors` is used. This means that the semantics of programs can actually depend on whether `-pedantic-errors` is passed, which seems really confusing because few people would expect compiler diagnostics to impact semantics. For example, it is possible to end up in a situation where ODR is violated (via a `#if __has_extension(...)` check) based solely on whether `-pedantic-errors` is passed, which illustrates very well why this is undesirable.

This led to e.g. the issue fixed in #84065, and more discussion is available on that review.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to