[clang] 7629621 - [Modules] Don't judge if we're compiling a module unit by LangOpts::CurrentModule.empty()

Chuanqi Xu via cfe-commits cfe-commits at lists.llvm.org
Sun Sep 18 01:46:50 PDT 2022


Author: Chuanqi Xu
Date: 2022-09-18T16:43:30+08:00
New Revision: 762962174e3adab1a0d744fe2636d4d9fb373c53

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

LOG: [Modules] Don't judge if we're compiling a module unit by LangOpts::CurrentModule.empty()

Closing https://github.com/llvm/llvm-project/issues/57778.

Previously it judge if we're compiling a module unit by
LangOpts::CurrentModule.empty(). But it is not true since we can specify
the module name by `-fmodule-name` option for arbitrary module unit.
Then this patch adjuest the judgement properly.

Added: 
    clang/test/SemaCXX/PR57778.cpp

Modified: 
    clang/include/clang/Basic/LangOptions.h
    clang/lib/Parse/ParseAST.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h
index dd2a7920a5f1..9facfb0beba2 100644
--- a/clang/include/clang/Basic/LangOptions.h
+++ b/clang/include/clang/Basic/LangOptions.h
@@ -113,7 +113,7 @@ class LangOptions : public LangOptionsBase {
     /// Compiling a module header unit.
     CMK_HeaderUnit,
 
-    /// Compiling a C++ modules TS module interface unit.
+    /// Compiling a C++ modules interface unit.
     CMK_ModuleInterface,
   };
 
@@ -495,11 +495,16 @@ class LangOptions : public LangOptionsBase {
   void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
 #include "clang/Basic/LangOptions.def"
 
-  /// Are we compiling a module interface (.cppm or module map)?
+  /// Are we compiling a module?
   bool isCompilingModule() const {
     return getCompilingModule() != CMK_None;
   }
 
+  /// Are we compiling a standard c++ module interface?
+  bool isCompilingModuleInterface() const {
+    return getCompilingModule() == CMK_ModuleInterface;
+  }
+
   /// Do we need to track the owning module for a local declaration?
   bool trackLocalOwningModule() const {
     return isCompilingModule() || ModulesLocalVisibility;

diff  --git a/clang/lib/Parse/ParseAST.cpp b/clang/lib/Parse/ParseAST.cpp
index 5fca029a4266..2e6d7eea4677 100644
--- a/clang/lib/Parse/ParseAST.cpp
+++ b/clang/lib/Parse/ParseAST.cpp
@@ -177,7 +177,7 @@ void clang::ParseAST(Sema &S, bool PrintStats, bool SkipFunctionBodies) {
 
   // At this point, we should know if we are building a non-header C++20 module.
   if (S.getLangOpts().CPlusPlusModules && !S.getLangOpts().IsHeaderFile &&
-      !S.getLangOpts().CurrentModule.empty()) {
+      S.getLangOpts().isCompilingModuleInterface()) {
     // If we are building the module from source, then the top level module
     // will be here.
     Module *CodegenModule = S.getCurrentModule();

diff  --git a/clang/test/SemaCXX/PR57778.cpp b/clang/test/SemaCXX/PR57778.cpp
new file mode 100644
index 000000000000..260dd7c97976
--- /dev/null
+++ b/clang/test/SemaCXX/PR57778.cpp
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -std=c++20 -fmodule-name=test -fsyntax-only %s -verify
+// expected-no-diagnostics
+
+// Ensure that we won't crash if we specified `-fmodule-name` in `c++20`
+// for a non module unit.
+int a;


        


More information about the cfe-commits mailing list