diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6537,9 +6537,12 @@ // FIXME: Find a better way to determine whether the language has modules // support by default, or just assume that all languages do. - bool HaveModules = - Std && (Std->containsValue("c++2a") || Std->containsValue("c++20") || - Std->containsValue("c++latest")); + bool HaveModules = Std && llvm::any_of(Std->getValues(), [](const char *S) { + constexpr llvm::StringRef CPP_MODULES_STD[] = { + "c++2a", "c++20", "c++2b", "c++latest", + "gnu++2a", "gnu++20", "gnu++2b"}; + return llvm::is_contained(CPP_MODULES_STD, S); + }); RenderModulesOptions(C, D, Args, Input, Output, CmdArgs, HaveModules); if (Args.hasFlag(options::OPT_fpch_validate_input_files_content, diff --git a/clang/test/Driver/cpp20-header-module.cpp b/clang/test/Driver/cpp20-header-module.cpp --- a/clang/test/Driver/cpp20-header-module.cpp +++ b/clang/test/Driver/cpp20-header-module.cpp @@ -3,7 +3,11 @@ // RUN: %clang -fmodules-ts -std=c++20 -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES // RUN: %clang -std=c++20 -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES // RUN: %clang -std=c++2a -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES +// RUN: %clang -std=c++2b -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES // RUN: %clang_cl /std:c++latest /Zs -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES +// RUN: %clang -std=gnu++20 -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES +// RUN: %clang -std=gnu++2a -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES +// RUN: %clang -std=gnu++2b -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=NO_HEADER_MODULES // // NO_HEADER_MODULES-NOT: -fheader-modules // NO_HEADER_MODULES: -cc1 @@ -13,6 +17,10 @@ // RUN: %clang -fmodules -fmodules-ts -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=HAS_HEADER_MODULES // RUN: %clang -fmodules -std=c++20 -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=HAS_HEADER_MODULES // RUN: %clang -fmodules -std=c++2a -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=HAS_HEADER_MODULES +// RUN: %clang -fmodules -std=c++2b -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=HAS_HEADER_MODULES +// RUN: %clang -fmodules -std=gnu++20 -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=HAS_HEADER_MODULES +// RUN: %clang -fmodules -std=gnu++2a -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=HAS_HEADER_MODULES +// RUN: %clang -fmodules -std=gnu++2b -fsyntax-only -v %s 2>&1 | FileCheck %s --check-prefix=HAS_HEADER_MODULES // // HAS_HEADER_MODULES-NOT: -fno-header-modules // HAS_HEADER_MODULES: -cc1 diff --git a/clang/test/Modules/cxx20-and-header-modules.cpp b/clang/test/Modules/cxx20-and-header-modules.cpp --- a/clang/test/Modules/cxx20-and-header-modules.cpp +++ b/clang/test/Modules/cxx20-and-header-modules.cpp @@ -2,9 +2,12 @@ // // Check header modules are disabled by default in C++20 mode. // RUN: %clang -std=c++20 -fsyntax-only -fno-implicit-modules -fmodules-cache-path=%t -I%S/Inputs/cxx20-and-header-modules -fmodule-map-file=%S/Inputs/cxx20-and-header-modules/a.map %s +// RUN: %clang -std=gnu++20 -fsyntax-only -fno-implicit-modules -fmodules-cache-path=%t -I%S/Inputs/cxx20-and-header-modules -fmodule-map-file=%S/Inputs/cxx20-and-header-modules/a.map %s // // Also run in the header modules mode. // RUN: %clang -std=c++20 -DBUILDING_MODULE -fmodules -fimplicit-modules -fmodules-cache-path=%t -I%S/Inputs/cxx20-and-header-modules -fmodule-map-file=%S/Inputs/cxx20-and-header-modules/a.map %s +// RUN: rm -rf %t +// RUN: %clang -std=gnu++20 -DBUILDING_MODULE -fmodules -fimplicit-modules -fmodules-cache-path=%t -I%S/Inputs/cxx20-and-header-modules -fmodule-map-file=%S/Inputs/cxx20-and-header-modules/a.map %s #define INCLUDING 1 #include "a.h"