[clang] d89c653 - [Clang] Fix filtering of inline namespaces for friend functions
Shafik Yaghmour via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 7 09:06:30 PDT 2023
Author: Shafik Yaghmour
Date: 2023-04-07T08:58:39-07:00
New Revision: d89c6530fdb57da31f4750bf941a0e4a090c4474
URL: https://github.com/llvm/llvm-project/commit/d89c6530fdb57da31f4750bf941a0e4a090c4474
DIFF: https://github.com/llvm/llvm-project/commit/d89c6530fdb57da31f4750bf941a0e4a090c4474.diff
LOG: [Clang] Fix filtering of inline namespaces for friend functions
PR D135370 implemented a performance improvement but it restricted the filtering
of declaration from inline namespace too much. In particular it did not filter
for the function template case.
This led to a regression and this PR removes that check.
This fixes: https://github.com/llvm/llvm-project/issues/61851
Differential Revision: https://reviews.llvm.org/D147762
Added:
Modified:
clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
clang/test/SemaTemplate/friend.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
index ba64591c96498..f9418829186ed 100644
--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -2293,7 +2293,7 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(
// Filter out previous declarations that don't match the scope. The only
// effect this has is to remove declarations found in inline namespaces
// for friend declarations with unqualified names.
- if (isFriend && !QualifierLoc && !FunctionTemplate) {
+ if (isFriend && !QualifierLoc) {
SemaRef.FilterLookupForScope(Previous, DC, /*Scope=*/ nullptr,
/*ConsiderLinkage=*/ true,
QualifierLoc.hasQualifier());
diff --git a/clang/test/SemaTemplate/friend.cpp b/clang/test/SemaTemplate/friend.cpp
index 1427db093ec94..b039f10e14d8b 100644
--- a/clang/test/SemaTemplate/friend.cpp
+++ b/clang/test/SemaTemplate/friend.cpp
@@ -148,3 +148,21 @@ namespace PR42513_comment3 {
template struct T<X1>;
int n = f((X1*)nullptr); // expected-error {{cannot initialize a variable of type 'int' with an rvalue of type 'std::nullptr_t'}}
}
+
+namespace GH61851 {
+namespace A {
+inline namespace B {
+ inline constexpr struct {} foo;
+}
+
+template <typename T>
+class Bar {
+ template <typename U>
+ friend void foo(U &&arg) {} // no diagnostic expected
+};
+}
+
+void foobar() {
+ A::Bar<int> b;
+}
+}
More information about the cfe-commits
mailing list