================
@@ -1362,20 +1368,30 @@ void Preprocessor::HandleDirective(Token &Result) {
       case tok::pp_module:
       case tok::pp___preprocessed_module:
       case tok::pp___preprocessed_import:
-        Diag(Result, diag::err_embedded_directive)
-            << (getLangOpts().CPlusPlusModules &&
-                Introducer.isModuleContextualKeyword(
-                    /*AllowExport=*/false))
-            << II->getName();
-        Diag(*ArgMacro, diag::note_macro_expansion_here)
-            << ArgMacro->getIdentifierInfo();
-        DiscardUntilEndOfDirective();
-        return;
+        return true;
       default:
-        break;
+        return false;
       }
+    };
+
+    // [cpp.replace.general] makes any embedded directive ill-formed in
+    // C++26; in earlier modes the construct is undefined behavior and only
+    // pedantically warned about.
+    const bool IsError = LangOpts.CPlusPlus26 ||
+                         (II && IsAlwaysUnsupported(II->getPPKeywordID()));
+
----------------
AaronBallman wrote:

I think it's reasonable as an error in all language modes but I don't think the 
changes here are quite correct. This is implementing 
https://eel.is/c++draft/cpp.replace#general-14.sentence-3 which has similar 
wording in C (undefined rather than requiring a diagnostic), and that's not 
dependent on the keyword. e.g., this should also be rejected:
```
#define FUNCTION_MACRO(...)

FUNCTION_MACRO(
#
)
```
because it's still a directive. I think the only time we need to look at 
identifier are the cases which don't start with a leading `#` here: 
https://eel.is/c++draft/cpp#pre-2 (because we already diagnose non-directives 
as an error: https://godbolt.org/z/s1dY3Kc4T) But those special cases also 
aren't handled correctly because this should be accepted (doesn't match the 
requirements to make it a directive):
```
#define FUNCTION_MACRO(...)

FUNCTION_MACRO(
module
)
```
but I don't think we even get into `HandleDirective` for the cases that don't 
start with `#` because we don't warn currently: https://godbolt.org/z/qKjjdr8sx

So I think there's a little bit more work to be done getting the diagnostics 
just right, but I think it's reasonable to diagnose as an error in C as well as 
C++. (Maybe drop the embedded directive changes from this PR so we can land it 
and then do those in a separate PR?)

https://github.com/llvm/llvm-project/pull/192073
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to