================ @@ -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())); + } ---------------- cor3ntin wrote:
Having a function-like macro name in a module. It would not be treated as a macro name because function-like macro are only replaced when a `(` follows, which can never be the case here. in the tests below, `export module A.FUNC_LIKE` should be a valid module name (and `export module A.FUNC_LIKE()` should be ill-formed with an `(` cannot appear in a module name, or you can have a custom diag explaining that macros are not expanded in module names) 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