Author: Yihan Wang
Date: 2026-07-10T21:57:23+08:00
New Revision: f66516456d3cf4cff2c1ab6d83afac6e2f9e4c26

URL: 
https://github.com/llvm/llvm-project/commit/f66516456d3cf4cff2c1ab6d83afac6e2f9e4c26
DIFF: 
https://github.com/llvm/llvm-project/commit/f66516456d3cf4cff2c1ab6d83afac6e2f9e4c26.diff

LOG: [clang] Don't crash in invalid #module directive (#208695)

The following preprocessing directive is not a C++ module directive,
don't handle it in C++ module subroutine.

```cpp
#module
```

Fixes https://github.com/llvm/llvm-project/issues/179220.

Signed-off-by: yronglin <[email protected]>

Added: 
    clang/test/Lexer/invalid-directive.cpp

Modified: 
    clang/docs/ReleaseNotes.md
    clang/lib/Lex/PPDirectives.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index bec72fc78394b..96317a3eece97 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -889,6 +889,7 @@ latest release, please see the [Clang Web 
Site](https://clang.llvm.org) or the
 - Correctly diagnose invalid non-dependent calls in dependent contexts. 
(#GH135694)
 - Fix initialization of GRO when GRO-return type mismatches, as part of 
CWG2563. (#GH98744)
 - Fix an error using an initializer list with array new for a type that is not 
default-constructible. (#GH81157)
+- Fixed a crash in invalid ``#module`` preprocessing directive. (#GH179220)
 - We no longer consider conversion operators when copy-initializing from the 
same type. This was non
   conforming and could lead to recursive constraint satisfaction checking. 
(#GH149443)
 - Fixed a crash in Itanium C++ name mangling for a lambda in a local class 
field initializer inside a constructor/destructor. (#GH176395)

diff  --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 20f2575254e7b..76ea6b6a6e19b 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -1455,10 +1455,11 @@ void Preprocessor::HandleDirective(Token &Result) {
       return HandlePragmaDirective({PIK_HashPragma, Introducer.getLocation()});
     case tok::pp_module:
     case tok::pp___preprocessed_module:
-      return HandleCXXModuleDirective(Result);
+      if (Introducer.isModuleContextualKeyword())
+        return HandleCXXModuleDirective(Result);
+      break;
     case tok::pp___preprocessed_import:
       return HandleCXXImportDirective(Result);
-    // GNU Extensions.
     case tok::pp_import:
       switch (Introducer.getKind()) {
       case tok::hash:
@@ -1470,6 +1471,8 @@ void Preprocessor::HandleDirective(Token &Result) {
       default:
         llvm_unreachable("not a valid import directive");
       }
+
+    // GNU Extensions.
     case tok::pp_include_next:
       return HandleIncludeNextDirective(Introducer.getLocation(), Result);
 

diff  --git a/clang/test/Lexer/invalid-directive.cpp 
b/clang/test/Lexer/invalid-directive.cpp
new file mode 100644
index 0000000000000..c20cc885e7a7b
--- /dev/null
+++ b/clang/test/Lexer/invalid-directive.cpp
@@ -0,0 +1,3 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s
+
+#module // expected-error {{invalid preprocessing directive}}


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

Reply via email to