[clang] [Clang][NFC] Consolidate tests for default argument substitution (PR #105617)
Younan Zhang via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 23 21:15:34 PDT 2024
https://github.com/zyn0217 updated https://github.com/llvm/llvm-project/pull/105617
>From b837b99272353cb792a9ef19f1f68fd0b4bf8514 Mon Sep 17 00:00:00 2001
From: Younan Zhang <zyn7109 at gmail.com>
Date: Thu, 22 Aug 2024 13:08:12 +0800
Subject: [PATCH] [Clang][NFC] Consolidate tests for default argument
substitution
Follow-up on 8ac140f39.
---
clang/test/SemaTemplate/default-arguments.cpp | 52 +++++
clang/test/SemaTemplate/default-parm-init.cpp | 190 ------------------
2 files changed, 52 insertions(+), 190 deletions(-)
delete mode 100644 clang/test/SemaTemplate/default-parm-init.cpp
diff --git a/clang/test/SemaTemplate/default-arguments.cpp b/clang/test/SemaTemplate/default-arguments.cpp
index d5d9687cc90f49..3b1fbda414c12b 100644
--- a/clang/test/SemaTemplate/default-arguments.cpp
+++ b/clang/test/SemaTemplate/default-arguments.cpp
@@ -229,3 +229,55 @@ namespace unevaluated {
template<int = 0> int f(int = a); // expected-warning 0-1{{extension}}
int k = sizeof(f());
}
+
+#if __cplusplus >= 201103L
+namespace GH68490 {
+
+template <typename T> struct S {
+ template <typename U>
+ constexpr int SizeOfU(int param = sizeof(U)) const;
+
+ template <typename U>
+ constexpr int SizeOfT(int param = sizeof(T)) const;
+};
+
+template <typename T> struct S<T *> {
+ template <typename U>
+ constexpr int SizeOfU(int param = sizeof(U)) const;
+
+ template <typename U>
+ constexpr int SizeOfT(int param = sizeof(T *)) const;
+};
+
+template <typename T>
+template <typename U>
+constexpr int S<T *>::SizeOfU(int param) const {
+ return param;
+}
+
+template <typename T>
+template <typename U>
+constexpr int S<T *>::SizeOfT(int param) const {
+ return param;
+}
+
+template <>
+template <typename T>
+constexpr int S<int>::SizeOfU(int param) const {
+ return param;
+}
+
+template <>
+template <typename T>
+constexpr int S<int>::SizeOfT(int param) const {
+ return param;
+}
+
+static_assert(S<int>().SizeOfU<char>() == sizeof(char), "");
+static_assert(S<int>().SizeOfT<char>() == sizeof(int), "");
+static_assert(S<short *>().SizeOfU<char>() == sizeof(char), "");
+static_assert(S<short *>().SizeOfT<char>() == sizeof(short *), "");
+
+} // namespace GH68490
+
+#endif
diff --git a/clang/test/SemaTemplate/default-parm-init.cpp b/clang/test/SemaTemplate/default-parm-init.cpp
deleted file mode 100644
index 73ba8998df6a98..00000000000000
--- a/clang/test/SemaTemplate/default-parm-init.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -std=c++17 -verify %s
-// RUN: %clang_cc1 -fsyntax-only -std=c++20 -verify %s
-// expected-no-diagnostics
-
-namespace std {
-
-template<typename Signature> class function;
-
-template<typename R, typename... Args> class invoker_base {
-public:
- virtual ~invoker_base() { }
- virtual R invoke(Args...) = 0;
- virtual invoker_base* clone() = 0;
-};
-
-template<typename F, typename R, typename... Args>
-class functor_invoker : public invoker_base<R, Args...> {
-public:
- explicit functor_invoker(const F& f) : f(f) { }
- R invoke(Args... args) { return f(args...); }
- functor_invoker* clone() { return new functor_invoker(f); }
-
-private:
- F f;
-};
-
-template<typename R, typename... Args>
-class function<R (Args...)> {
-public:
- typedef R result_type;
- function() : invoker (0) { }
- function(const function& other) : invoker(0) {
- if (other.invoker)
- invoker = other.invoker->clone();
- }
-
- template<typename F> function(const F& f) : invoker(0) {
- invoker = new functor_invoker<F, R, Args...>(f);
- }
-
- ~function() {
- if (invoker)
- delete invoker;
- }
-
- function& operator=(const function& other) {
- function(other).swap(*this);
- return *this;
- }
-
- template<typename F>
- function& operator=(const F& f) {
- function(f).swap(*this);
- return *this;
- }
-
- void swap(function& other) {
- invoker_base<R, Args...>* tmp = invoker;
- invoker = other.invoker;
- other.invoker = tmp;
- }
-
- result_type operator()(Args... args) const {
- return invoker->invoke(args...);
- }
-
-private:
- invoker_base<R, Args...>* invoker;
-};
-
-}
-
-template<typename TemplateParam>
-struct Problem {
- template<typename FunctionTemplateParam>
- constexpr int FuncAlign(int param = alignof(FunctionTemplateParam));
-
- template<typename FunctionTemplateParam>
- constexpr int FuncSizeof(int param = sizeof(FunctionTemplateParam));
-
- template<typename FunctionTemplateParam>
- constexpr int FuncAlign2(int param = alignof(TemplateParam));
-
- template<typename FunctionTemplateParam>
- constexpr int FuncSizeof2(int param = sizeof(TemplateParam));
-};
-
-template<typename TemplateParam>
-struct Problem<TemplateParam*> {
- template<typename FunctionTemplateParam>
- constexpr int FuncAlign(int param = alignof(FunctionTemplateParam));
-
- template<typename FunctionTemplateParam>
- constexpr int FuncSizeof(int param = sizeof(FunctionTemplateParam));
-
- template<typename FunctionTemplateParam>
- constexpr int FuncAlign2(int param = alignof(TemplateParam));
-
- template<typename FunctionTemplateParam>
- constexpr int FuncSizeof2(int param = sizeof(TemplateParam));
-};
-
-template<typename TemplateParam>
-template<typename FunctionTemplateParam>
-constexpr int Problem<TemplateParam*>::FuncAlign(int param) {
- return 2U*param;
-}
-
-template<typename TemplateParam>
-template<typename FunctionTemplateParam>
-constexpr int Problem<TemplateParam*>::FuncSizeof(int param) {
- return 2U*param;
-}
-
-template<typename TemplateParam>
-template<typename FunctionTemplateParam>
-constexpr int Problem<TemplateParam*>::FuncAlign2(int param) {
- return 2U*param;
-}
-
-template<typename TemplateParam>
-template<typename FunctionTemplateParam>
-constexpr int Problem<TemplateParam*>::FuncSizeof2(int param) {
- return 2U*param;
-}
-
-template <>
-template<typename FunctionTemplateParam>
-constexpr int Problem<int>::FuncAlign(int param) {
- return param;
-}
-
-template <>
-template<typename FunctionTemplateParam>
-constexpr int Problem<int>::FuncSizeof(int param) {
- return param;
-}
-
-template <>
-template<typename FunctionTemplateParam>
-constexpr int Problem<int>::FuncAlign2(int param) {
- return param;
-}
-
-template <>
-template<typename FunctionTemplateParam>
-constexpr int Problem<int>::FuncSizeof2(int param) {
- return param;
-}
-
-void foo() {
- Problem<int> p = {};
- static_assert(p.FuncAlign<char>() == alignof(char));
- static_assert(p.FuncSizeof<char>() == sizeof(char));
- static_assert(p.FuncAlign2<char>() == alignof(int));
- static_assert(p.FuncSizeof2<char>() == sizeof(int));
- Problem<short*> q = {};
- static_assert(q.FuncAlign<char>() == 2U * alignof(char));
- static_assert(q.FuncSizeof<char>() == 2U * sizeof(char));
- static_assert(q.FuncAlign2<char>() == 2U *alignof(short));
- static_assert(q.FuncSizeof2<char>() == 2U * sizeof(short));
-}
-
-template <typename T>
-class A {
- public:
- void run(
- std::function<void(T&)> f1 = [](auto&&) {},
- std::function<void(T&)> f2 = [](auto&&) {});
- private:
- class Helper {
- public:
- explicit Helper(std::function<void(T&)> f2) : f2_(f2) {}
- std::function<void(T&)> f2_;
- };
-};
-
-template <typename T>
-void A<T>::run(std::function<void(T&)> f1,
- std::function<void(T&)> f2) {
- Helper h(f2);
-}
-
-struct B {};
-
-int main() {
- A<B> a;
- a.run([&](auto& l) {});
- return 0;
-}
More information about the cfe-commits
mailing list