-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Clang][Sema] Don't consider top-level cv-qualifiers in template partial orderings #81449
Conversation
…ial orderings This fixes a regression since llvm@340eac0, from which we compared function parameter types with cv-qualifiers taken into account. However, as per [dcl.fct]/p5: > After producing the list of parameter types, any top-level cv-qualifiers modifying > a parameter type are deleted when forming the function type. Thus I think we should use hasSameUnqualifiedType for type comparison. This fixes llvm#75404.
The Windows CI is still not working; I ran the libc++ tests locally and they are green. |
@llvm/pr-subscribers-clang Author: Younan Zhang (zyn0217) ChangesThis fixes a regression since 340eac0, from which we compared function parameter types with cv-qualifiers taken into account. However, as per [dcl.fct]/p5: > After producing the list of parameter types, any top-level cv-qualifiers modifying Thus, I think we should use This fixes #75404. Full diff: https://github.com/llvm/llvm-project/pull/81449.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index ece6013f672621..88006b4fb782e9 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -225,6 +225,8 @@ Bug Fixes to C++ Support
or non-constant more accurately. Previously, only a subset of the initializer
elements were considered, misclassifying some initializers as constant. Fixes
some of (`#80510 <https://github.com/llvm/llvm-project/issues/80510>`).
+- Clang now ignores top-level cv-qualifiers on function parameters in template partial orderings.
+ (`#75404 <https://github.com/llvm/llvm-project/issues/75404>`_)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index a54ad27975890a..69c35db2945eb7 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -5599,9 +5599,12 @@ FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(
Sema::TPL_TemplateParamsEquivalent))
return nullptr;
+ // [dcl.fct]p5:
+ // Any top-level cv-qualifiers modifying a parameter type are deleted when
+ // forming the function type.
for (unsigned i = 0; i < NumParams1; ++i)
- if (!Context.hasSameType(FD1->getParamDecl(i)->getType(),
- FD2->getParamDecl(i)->getType()))
+ if (!Context.hasSameUnqualifiedType(FD1->getParamDecl(i)->getType(),
+ FD2->getParamDecl(i)->getType()))
return nullptr;
// C++20 [temp.func.order]p6.3:
diff --git a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
index dae1ba760cc203..db3e3e3bc85966 100644
--- a/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
+++ b/clang/test/CXX/over/over.match/over.match.best/p1-2a.cpp
@@ -97,13 +97,16 @@ namespace non_template
static_assert(is_same_v<decltype(baz<int>()), int>); // expected-error {{call to 'baz' is ambiguous}}
static_assert(is_same_v<decltype(bar<int>()), void>); // expected-error {{call to 'bar' is ambiguous}}
+ // Top-level cv-qualifiers are ignored in template partial ordering per [dcl.fct]/p5.
+ // After producing the list of parameter types, any top-level cv-qualifiers modifying
+ // a parameter type are deleted when forming the function type.
template<typename T>
- constexpr int goo(int a) requires AtLeast2<int> && true { // expected-note {{candidate function}}
+ constexpr int goo(T a) requires AtLeast2<T> && true {
return 1;
}
template<typename T>
- constexpr int goo(const int b) requires AtLeast2<int> { // expected-note {{candidate function}}
+ constexpr int goo(const T b) requires AtLeast2<T> {
return 2;
}
@@ -122,7 +125,6 @@ namespace non_template
return 2;
}
- // By temp.func.order-6.2.2, this is ambiguous because parameter a and b have different types.
- static_assert(goo<int>(1) == 1); // expected-error {{call to 'goo' is ambiguous}}
+ static_assert(goo<int>(1) == 1);
static_assert(doo<int>(2) == 1);
}
|
This fixes a regression since 340eac0, from which we compared function parameter types with cv-qualifiers taken into account. However, as per [dcl.fct]/p5:
Thus, I think we should use
hasSameUnqualifiedType
for type comparison.This fixes #75404.