diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -1172,6 +1172,12 @@ } } + /// Clears the namespace of this declaration. + /// + /// This is useful if we want this declaration to be available for + /// redeclaration lookup but otherwise hidden for ordinary name lookups. + void clearIdentifierNamespace() { IdentifierNamespace = 0; } + enum FriendObjectKind { FOK_None, ///< Not a friend object. FOK_Declared, ///< A friend of a previously-declared entity. diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -11567,6 +11567,10 @@ &PP.getIdentifierTable().get("std"), /*PrevDecl=*/nullptr, /*Nested=*/false); getStdNamespace()->setImplicit(true); + // We want the created NamespaceDecl to be available for redeclaration + // lookups, but not for regular name lookups. + Context.getTranslationUnitDecl()->addDecl(getStdNamespace()); + getStdNamespace()->clearIdentifierNamespace(); } return getStdNamespace(); diff --git a/clang/test/Modules/match_initializer_list.cpp b/clang/test/Modules/match_initializer_list.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Modules/match_initializer_list.cpp @@ -0,0 +1,19 @@ +// RUN: rm -rf %t +// +// RUN: %clang_cc1 -x c++ -fmodules -fmodules-cache-path=%t \ +// RUN: -I %S/Inputs/initializer_list \ +// RUN: -fmodule-map-file=%S/Inputs/initializer_list/direct.modulemap \ +// RUN: %s -verify + +// expected-no-diagnostics + +class C { + public: + virtual ~C() {} +}; + +#include "Inputs/initializer_list/direct.h" + +void takesInitList(std::initializer_list); + +void passesInitList() { takesInitList({0}); }