diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 4e6d7bb16f51b..fd6c250efeda2 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3163,8 +3163,8 @@ static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, StringRef Val = A->getValue(); if (Val.contains('=')) { auto Split = Val.split('='); - Opts.PrebuiltModuleFiles.insert( - {std::string(Split.first), std::string(Split.second)}); + Opts.PrebuiltModuleFiles.insert_or_assign( + std::string(Split.first), std::string(Split.second)); } } for (const auto *A : Args.filtered(OPT_fprebuilt_module_path)) diff --git a/clang/test/Modules/duplicated-module-file-eq-module-name.cppm b/clang/test/Modules/duplicated-module-file-eq-module-name.cppm new file mode 100644 index 0000000000000..e86dbe2b941ef --- /dev/null +++ b/clang/test/Modules/duplicated-module-file-eq-module-name.cppm @@ -0,0 +1,21 @@ +// Tests that we will pick the last `-fmodule-file==` flag +// for . + +// RUN: rm -rf %t +// RUN: split-file %s %t +// RUN: cd %t +// +// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm +// RUN: %clang_cc1 -std=c++20 %t/u.cpp -fmodule-file=a=%t/unexist.pcm \ +// RUN: -fmodule-file=a=%t/a.pcm -verify -fsyntax-only + +//--- a.cppm +export module a; +export int a(); + +//--- u.cpp +// expected-no-diagnostics +import a; +int u() { + return a(); +}