diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 39732a029e85..c41dc3309a5c 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7373,7 +7373,7 @@ bool Sema::isStdInitializerList(QualType Ty, QualType *Element) { StdInitializerList = Template; } - if (Template != StdInitializerList) + if (Template->getCanonicalDecl() != StdInitializerList->getCanonicalDecl()) return false; // This is an instance of std::initializer_list. Find the argument type. diff --git a/clang/test/Modules/Inputs/initializer_list b/clang/test/Modules/Inputs/initializer_list/direct.h similarity index 100% rename from clang/test/Modules/Inputs/initializer_list rename to clang/test/Modules/Inputs/initializer_list/direct.h diff --git a/clang/test/Modules/Inputs/initializer_list/direct.modulemap b/clang/test/Modules/Inputs/initializer_list/direct.modulemap new file mode 100644 index 000000000000..56a410002012 --- /dev/null +++ b/clang/test/Modules/Inputs/initializer_list/direct.modulemap @@ -0,0 +1 @@ +module initializer_list { header "direct.h" } diff --git a/clang/test/Modules/Inputs/initializer_list/indirect.h b/clang/test/Modules/Inputs/initializer_list/indirect.h new file mode 100644 index 000000000000..75e9817dce37 --- /dev/null +++ b/clang/test/Modules/Inputs/initializer_list/indirect.h @@ -0,0 +1 @@ +#include "direct.h" diff --git a/clang/test/Modules/Inputs/initializer_list/indirect.modulemap b/clang/test/Modules/Inputs/initializer_list/indirect.modulemap new file mode 100644 index 000000000000..14deacfddfe1 --- /dev/null +++ b/clang/test/Modules/Inputs/initializer_list/indirect.modulemap @@ -0,0 +1 @@ +module initializer_list { header "indirect.h" } diff --git a/clang/test/Modules/Inputs/module.map b/clang/test/Modules/Inputs/module.map index 7040ee7e5ab6..8ec3e21121b7 100644 --- a/clang/test/Modules/Inputs/module.map +++ b/clang/test/Modules/Inputs/module.map @@ -296,10 +296,6 @@ module warn_unused_local_typedef { header "warn-unused-local-typedef.h" } -module initializer_list { - header "initializer_list" -} - module using_decl { module a { header "using-decl-a.h" export * } module b { header "using-decl-b.h" export * } diff --git a/clang/test/Modules/initializer_list.cpp b/clang/test/Modules/initializer_list.cpp index 0cbcbbb70e46..ea6e282195d9 100644 --- a/clang/test/Modules/initializer_list.cpp +++ b/clang/test/Modules/initializer_list.cpp @@ -1,7 +1,23 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodules-cache-path=%t -I %S/Inputs %s -verify -std=c++11 +// +// RUN: %clang_cc1 -x objective-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 -std=c++11 +// +// RUN: %clang_cc1 -x objective-c++ -fmodules -fmodules-cache-path=%t \ +// RUN: -I %S/Inputs/initializer_list \ +// RUN: -fmodule-map-file=%S/Inputs/initializer_list/indirect.modulemap \ +// RUN: %s -verify -std=c++11 -DINCLUDE_DIRECT // expected-no-diagnostics + +#ifdef INCLUDE_DIRECT +#include "direct.h" +auto k = {1, 2, 3}; +#endif + @import initializer_list; +auto v = {1, 2, 3}; int n = std::min({1, 2, 3});