[PATCH] D129068: [AST] Profiling on constraint expression instead of arguments for TypeConstraint in ASTContext::isSameTemplateParameter
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 6 23:36:41 PDT 2022
ChuanqiXu updated this revision to Diff 442792.
ChuanqiXu added a comment.
Minor changes.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D129068/new/
https://reviews.llvm.org/D129068
Files:
clang/lib/AST/ASTContext.cpp
clang/test/Modules/concept.cppm
Index: clang/test/Modules/concept.cppm
===================================================================
--- clang/test/Modules/concept.cppm
+++ clang/test/Modules/concept.cppm
@@ -18,6 +18,9 @@
template <class _Tp>
concept __member_size = requires(_Tp &&t) { t.size(); };
+template <class First, class Second>
+concept C = requires(First x, Second y) { x+y; };
+
struct A {
public:
template <Range T>
@@ -29,6 +32,16 @@
constexpr __integer_like auto operator()(_Tp&& __t) const {
return __t.size();
}
+
+ template <__integer_like _Tp, C<_Tp> Sentinel>
+ constexpr _Tp operator()(_Tp &&__t, Sentinel &&last) const {
+ return __t;
+ }
+
+ template <template<class> class H, class S, C<H<S>> Sentinel>
+ constexpr H<S> operator()(H<S> &&__s, Sentinel &&last) const {
+ return __s;
+ }
};
#endif
@@ -44,6 +57,11 @@
export module B;
import A;
+template <class T>
+struct U {
+ auto operator+(U) { return 0; }
+};
+
void foo() {
A a;
struct S {
@@ -51,4 +69,7 @@
auto operator+(S s) { return 0; }
};
__fn{}(S());
+ __fn{}(S(), S());
+
+ __fn{}(U<int>(), U<int>());
}
Index: clang/lib/AST/ASTContext.cpp
===================================================================
--- clang/lib/AST/ASTContext.cpp
+++ clang/lib/AST/ASTContext.cpp
@@ -6245,14 +6245,31 @@
auto *TYTCArgs = TYTC->getTemplateArgsAsWritten();
if (TXTCArgs->NumTemplateArgs != TYTCArgs->NumTemplateArgs)
return false;
- llvm::FoldingSetNodeID XID, YID;
- for (auto &ArgLoc : TXTCArgs->arguments())
- ArgLoc.getArgument().Profile(XID, X->getASTContext());
- for (auto &ArgLoc : TYTCArgs->arguments())
- ArgLoc.getArgument().Profile(YID, Y->getASTContext());
- if (XID != YID)
- return false;
+ // We couldn't compare the profiling result for the template
+ // args here. Consider the following example in different modules:
+ //
+ // template <__integer_like _Tp, C<_Tp> Sentinel>
+ // constexpr _Tp operator()(_Tp &&__t, Sentinel &&last) const {
+ // return __t;
+ // }
+ //
+ // When we compare the profiling result for `C<_Tp>` in different
+ // modules, it will compare the type of `_Tp` in different modules.
+ // However, the type of `_Tp` in different modules refer to different
+ // types here naturally. So we couldn't compare the profiling result
+ // for the template args directly.
+ }
+ llvm::FoldingSetNodeID XID, YID;
+ auto *XConstraint = TXTC->getImmediatelyDeclaredConstraint();
+ auto *YConstraint = TYTC->getImmediatelyDeclaredConstraint();
+ if (!XConstraint != !YConstraint)
+ return false;
+ if (XConstraint) {
+ XConstraint->Profile(XID, *this, /*Canonical=*/true);
+ YConstraint->Profile(YID, *this, /*Canonical=*/true);
}
+ if (XID != YID)
+ return false;
}
return true;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D129068.442792.patch
Type: text/x-patch
Size: 3001 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220707/e5ba20dc/attachment.bin>
More information about the cfe-commits
mailing list