Author: Chuanqi Xu Date: 2023-05-11T10:21:52+08:00 New Revision: 6e85d2708115bc1c7cd1bf1674b64934a3cf6c25
URL: https://github.com/llvm/llvm-project/commit/6e85d2708115bc1c7cd1bf1674b64934a3cf6c25 DIFF: https://github.com/llvm/llvm-project/commit/6e85d2708115bc1c7cd1bf1674b64934a3cf6c25.diff LOG: [C++] Don't filter using declaration when we perform qualified look up Close https://github.com/llvm/llvm-project/issues/62174 And this was originally a try to close https://github.com/llvm/llvm-project/issues/62158. I don't feel this is the correct fix. I just think it is not bad as an ad-hoc patch. And let's discuss things in the higher-level in the above GitHub issue link. Reviewed By: erichkeane Differential Revision: https://reviews.llvm.org/D148506 Added: clang/test/Modules/pr62158.cppm clang/test/SemaCXX/pr62174.cpp Modified: clang/lib/Sema/SemaDecl.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 4cdf2982b99d..f499a8658d73 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1821,17 +1821,21 @@ bool Sema::IsRedefinitionInModule(const NamedDecl *New, return OldM == NewM; } -static bool isUsingDecl(NamedDecl *D) { +static bool isUsingDeclNotAtClassScope(NamedDecl *D) { + if (D->getDeclContext()->isFileContext()) + return false; + return isa<UsingShadowDecl>(D) || isa<UnresolvedUsingTypenameDecl>(D) || isa<UnresolvedUsingValueDecl>(D); } -/// Removes using shadow declarations from the lookup results. +/// Removes using shadow declarations not at class scope from the lookup +/// results. static void RemoveUsingDecls(LookupResult &R) { LookupResult::Filter F = R.makeFilter(); while (F.hasNext()) - if (isUsingDecl(F.next())) + if (isUsingDeclNotAtClassScope(F.next())) F.erase(); F.done(); @@ -6378,10 +6382,6 @@ NamedDecl *Sema::HandleDeclarator(Scope *S, Declarator &D, // containing the two f's declared in X, but neither of them // matches. - // C++ [dcl.meaning]p1: - // [...] the member shall not merely have been introduced by a - // using-declaration in the scope of the class or namespace nominated by - // the nested-name-specifier of the declarator-id. RemoveUsingDecls(Previous); } diff --git a/clang/test/Modules/pr62158.cppm b/clang/test/Modules/pr62158.cppm new file mode 100644 index 000000000000..7a0761df7715 --- /dev/null +++ b/clang/test/Modules/pr62158.cppm @@ -0,0 +1,46 @@ +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/lib.cppm -o %t/lib.pcm +// RUN: %clang_cc1 -std=c++20 %t/main.cpp -fmodule-file=lib=%t/lib.pcm \ +// RUN: -verify -fsyntax-only + +//--- header.h +namespace lib::inline __1 { +template <class> +inline constexpr bool test = false; +template <class> +constexpr bool func() { + return false; +} +inline constexpr bool non_templ = true; +} // namespace lib + +//--- lib.cppm +module; +#include "header.h" +export module lib; + +export namespace lib { + using lib::test; + using lib::func; + using lib::non_templ; +} // namespace lib + +//--- main.cpp +// expected-no-diagnostics +import lib; + +struct foo {}; + +template <> +inline constexpr bool lib::test<foo> = true; + +template <> +constexpr bool lib::func<foo>() { + return true; +} + +static_assert(lib::test<foo>); +static_assert(lib::func<foo>()); diff --git a/clang/test/SemaCXX/pr62174.cpp b/clang/test/SemaCXX/pr62174.cpp new file mode 100644 index 000000000000..a5283706ec4f --- /dev/null +++ b/clang/test/SemaCXX/pr62174.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -std=c++20 %s -fsyntax-only -verify +// expected-no-diagnostics +namespace lib { + namespace impl { + template <class> + inline constexpr bool test = false; + } + using impl::test; +} + +struct foo {}; + +template <> +inline constexpr bool lib::test<foo> = true; + +static_assert(lib::test<foo>); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits