-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[Clang][Sema] ASTContext::getUnconstrainedType propagates dependence #92425
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
Conversation
@llvm/pr-subscribers-clang Author: Krystian Stasiowski (sdkrystian) ChangesWhen the argument passed to template<typename T>
concept C = sizeof(T) == sizeof(int);
template<auto N>
struct A;
template<C auto N>
struct A<N> { }; // error: class template partial specialization is not more specialized than the primary template When comparing the template parameters for equivalence, This patch changes Full diff: https://github.com/llvm/llvm-project/pull/92425.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index be4cded276321..21f273cf8f54e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -723,6 +723,7 @@ Bug Fixes to C++ Support
- Clang now ignores template parameters only used within the exception specification of candidate function
templates during partial ordering when deducing template arguments from a function declaration or when
taking the address of a function template.
+- Fix a bug with checking constrained non-type template parameters for equivalence.
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 4475f399a120b..8fc2bb8c401c2 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -5910,7 +5910,8 @@ QualType ASTContext::getUnconstrainedType(QualType T) const {
if (auto *AT = CanonT->getAs<AutoType>()) {
if (!AT->isConstrained())
return T;
- return getQualifiedType(getAutoType(QualType(), AT->getKeyword(), false,
+ return getQualifiedType(getAutoType(QualType(), AT->getKeyword(),
+ AT->isDependentType(),
AT->containsUnexpandedParameterPack()),
T.getQualifiers());
}
diff --git a/clang/test/CXX/temp/temp.decls/temp.fct/temp.func.order/p2.cpp b/clang/test/CXX/temp/temp.decls/temp.fct/temp.func.order/p2.cpp
new file mode 100644
index 0000000000000..5c908d789d511
--- /dev/null
+++ b/clang/test/CXX/temp/temp.decls/temp.fct/temp.func.order/p2.cpp
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s
+// expected-no-diagnostics
+
+template<typename T>
+concept C = sizeof(T) == sizeof(int);
+
+template<auto N>
+struct A;
+
+template<C auto N>
+struct A<N> { };
|
7905c01
to
c26365e
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
When the argument passed to
ASTContext::getUnconstrainedType
is an unconstrainedAutoType
, will return the argument unchanged. However, when called with a constrainedAutoType
, an unconstrained, non-dependentAutoType
will be returned even if the argument was dependent. Consider the following:When comparing the template parameters for equivalence,
ASTContext::getUnconstrainedType
is used to remove the constraints per [temp.over.link] p6 sentence 2. For the template parameterN
of the class template, it returns a dependentAutoType
. For the template parameterN
of the class template partial specialization, it returns a non-dependentAutoType
. We subsequently compare the adjusted types and find they are not equivalent, thus we consider the partial specialization to not be more specialized than the primary template per [temp.func.order] p6.2.2.This patch changes
ASTContext::getUnconstrainedType
such that the dependence of a constrainedAutoType
will propagate to the returned unconstrainedAutoType
. This causes the above example to be correctly accepted, fixing #77377.