From 5426a3e28f6f1f9b62689c00e3d487477bacf7cd Mon Sep 17 00:00:00 2001 From: alandefreitas Date: Wed, 22 Jan 2025 01:19:15 -0300 Subject: [PATCH] SFINAE return type constraints #feat --- src/lib/AST/ASTVisitor.cpp | 14 ++++++++++++++ test-files/golden-tests/core/libcxx.adoc | 3 ++- test-files/golden-tests/core/libcxx.html | 3 ++- test-files/golden-tests/core/libcxx.xml | 2 +- test-files/golden-tests/metadata/sfinae.adoc | 12 ++++++++---- test-files/golden-tests/metadata/sfinae.html | 12 ++++++++---- test-files/golden-tests/metadata/sfinae.xml | 8 ++++---- test-files/golden-tests/snippets/sqrt.adoc | 3 ++- test-files/golden-tests/snippets/sqrt.html | 3 ++- test-files/golden-tests/snippets/sqrt.xml | 2 +- 10 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/lib/AST/ASTVisitor.cpp b/src/lib/AST/ASTVisitor.cpp index 05f3956be7..2ba05ca624 100644 --- a/src/lib/AST/ASTVisitor.cpp +++ b/src/lib/AST/ASTVisitor.cpp @@ -872,6 +872,20 @@ populate( } else { + // Return type SFINAE constraints + if (I.ReturnType && + !I.ReturnType->Constraints.empty()) + { + for (ExprInfo const& constraint: I.ReturnType->Constraints) + { + if (!I.Requires.Written.empty()) + { + I.Requires.Written += " && "; + } + I.Requires.Written += constraint.Written; + } + } + // Iterate I.Params to find trailing requires clauses for (auto it = I.Params.begin(); it != I.Params.end(); ) { diff --git a/test-files/golden-tests/core/libcxx.adoc b/test-files/golden-tests/core/libcxx.adoc index 4b3178f4be..3f74a36792 100644 --- a/test-files/golden-tests/core/libcxx.adoc +++ b/test-files/golden-tests/core/libcxx.adoc @@ -31,7 +31,8 @@ Declared in `<libcxx.cpp>` ---- template<typename T> T -sqrt(T value); +sqrt(T value) +requires std::is_integral_v<T>; ---- === Description diff --git a/test-files/golden-tests/core/libcxx.html b/test-files/golden-tests/core/libcxx.html index a2f4bce734..e796448704 100644 --- a/test-files/golden-tests/core/libcxx.html +++ b/test-files/golden-tests/core/libcxx.html @@ -41,7 +41,8 @@

Synopsis

template<typename T> T -sqrt(T value); +sqrt(T value) +requires std::is_integral_v<T>; diff --git a/test-files/golden-tests/core/libcxx.xml b/test-files/golden-tests/core/libcxx.xml index f961338fbd..8db6bbd8c9 100644 --- a/test-files/golden-tests/core/libcxx.xml +++ b/test-files/golden-tests/core/libcxx.xml @@ -4,7 +4,7 @@