Author: Chuanqi Xu Date: 2023-09-28T10:24:50+08:00 New Revision: f9558c691128cbc1660f69bd3b5f547be90ed18b
URL: https://github.com/llvm/llvm-project/commit/f9558c691128cbc1660f69bd3b5f547be90ed18b DIFF: https://github.com/llvm/llvm-project/commit/f9558c691128cbc1660f69bd3b5f547be90ed18b.diff LOG: [C++20] [Modules] Handle import decl before module declaration without being in GMF Close https://github.com/llvm/llvm-project/issues/67627 In a module unit, all the declaration before the modoule declaration should live in the GMF. Added: clang/test/Modules/pr67627.cppm Modified: clang/lib/Parse/Parser.cpp Removed: ################################################################################ diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index dda1dbaa0c21aa9..9d2c2fd9a5fa5d6 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -2564,6 +2564,10 @@ Decl *Parser::ParseModuleImport(SourceLocation AtLoc, SeenError = false; break; case Sema::ModuleImportState::FirstDecl: + // If we found an import decl as the first declaration, we must be not in + // a C++20 module unit or we are in an invalid state. + ImportState = Sema::ModuleImportState::NotACXX20Module; + [[fallthrough]]; case Sema::ModuleImportState::NotACXX20Module: // We can only import a partition within a module purview. if (IsPartition) diff --git a/clang/test/Modules/pr67627.cppm b/clang/test/Modules/pr67627.cppm new file mode 100644 index 000000000000000..3d4410229080a98 --- /dev/null +++ b/clang/test/Modules/pr67627.cppm @@ -0,0 +1,13 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm +// RUN: %clang_cc1 -std=c++20 %t/B.cppm -fmodule-file=A=%t/A.pcm -fsyntax-only -verify + +//--- A.cppm +export module A; + +//--- B.cppm +import A; // expected-note {{add 'module;' to the start of the file to introduce a global module fragment}} +export module B; // expected-error {{module declaration must occur at the start of the translation unit}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits