================
@@ -2686,18 +2693,31 @@ bool Parser::ParseModuleName(
       }
 
       Diag(Tok, diag::err_module_expected_ident) << IsImport;
-      SkipUntil(tok::semi);
+      SkipUntil(tok::semi, StopBeforeMatch);
       return true;
     }
 
-    // Record this part of the module path.
-    Path.push_back(std::make_pair(Tok.getIdentifierInfo(), Tok.getLocation()));
+    Token Identifier = Tok;
     ConsumeToken();
 
-    if (Tok.isNot(tok::period))
-      return false;
+    // P3034R1: Module Declarations Shouldn’t be Macros.
+    const auto *MI = PP.getMacroInfo(Identifier.getIdentifierInfo());
+    if (!IsImport && MI) {
+      HasMacroInModuleName = true;
+      if (MI->isFunctionLike())
+        SkipUntil(tok::r_paren, tok::period, tok::colon,
+                  StopAtSemi | StopBeforeMatch);
+      Diag(Identifier, diag::err_module_decl_cannot_be_macros)
+          << Identifier.getLocation() << IsPartition << MI->isFunctionLike()
+          << Identifier.getIdentifierInfo();
+    } else if (!HasMacroInModuleName) {
+      // Record this part of the module path.
+      Path.push_back(std::make_pair(Identifier.getIdentifierInfo(),
+                                    Identifier.getLocation()));
+    }
----------------
yronglin wrote:

Thanks! I've fixed this issue. Hmm, I tried to add a note diagnostic in local, 
but seems it's a bit noisy and redundant.
```
➜  test ../rel/bin/clang++ -c -std=c++20 ./lib.cppm
./lib.cppm:6:15: error: the name of a module declaration cannot contains an 
object-like macro 'A'
    6 | export module A.FUNC_LIKE():CC;
      |               ^
./lib.cppm:6:15: note: object-like macro in the name of a module declaration 
will not expand
    6 | export module A.FUNC_LIKE():CC;
      |               ^
./lib.cppm:6:17: error: the name of a module declaration cannot contains a 
function-like macro 'FUNC_LIKE'
    6 | export module A.FUNC_LIKE():CC;
      |                 ^~~~~~~~~~~
./lib.cppm:6:17: note: function-like macro in the name of a module partition 
declaration will not expand
    6 | export module A.FUNC_LIKE():CC;
      |                 ^~~~~~~~~~~
./lib.cppm:6:29: error: the name of a module partition declaration cannot 
contains an object-like macro 'CC'
    6 | export module A.FUNC_LIKE():CC;
      |                             ^~
./lib.cppm:6:29: note: object-like macro in the name of a module declaration 
will not expand
    6 | export module A.FUNC_LIKE():CC;
      |                             ^~
3 errors generated.
```

https://github.com/llvm/llvm-project/pull/90574
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to