From c15ec08eedf060d191ac3a16e5271c1a9a6f9eb7 Mon Sep 17 00:00:00 2001 From: Mihail Mihov Date: Thu, 12 Sep 2024 00:49:17 +0200 Subject: [PATCH] Add constexpr consteval tests for forward mode --- test/ForwardMode/ConstevalTest.C | 57 +++++++++++++++++++++++++++++ test/ForwardMode/ConstexprTest.C | 62 ++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 test/ForwardMode/ConstevalTest.C create mode 100644 test/ForwardMode/ConstexprTest.C diff --git a/test/ForwardMode/ConstevalTest.C b/test/ForwardMode/ConstevalTest.C new file mode 100644 index 000000000..c7c62269f --- /dev/null +++ b/test/ForwardMode/ConstevalTest.C @@ -0,0 +1,57 @@ +// RUN: %cladclang %s -I%S/../../include -std=c++23 -oConstevalTest.out | %filecheck %s +// RUN: ./ConstevalTest.out | %filecheck_exec %s + +#include + +#include "clad/Differentiator/Differentiator.h" + +#include "../TestUtils.h" + + +consteval double fn(double a, double b) { + return (a+b)/2; +} + +//CHECK: consteval double fn_darg0(double a, double b) { +//CHECK-NEXT: double _d_a = 1; +//CHECK-NEXT: double _d_b = 0; +//CHECK-NEXT: double _t0 = (a + b); +//CHECK-NEXT: return ((_d_a + _d_b) * 2 - _t0 * 0) / (2 * 2); +//CHECK-NEXT:} + +consteval double mul(double a, double b, double c) { + double val = 99.00; + double result = val * a + 100 - b + c; + return result; +} + +//CHECK: consteval double mul_darg0(double a, double b, double c) { +//CHECK-NEXT: double _d_a = 1; +//CHECK-NEXT: double _d_b = 0; +//CHECK-NEXT: double _d_c = 0; +//CHECK-NEXT: double _d_val = 0.; +//CHECK-NEXT: double val = 99.; +//CHECK-NEXT: double _d_result = _d_val * a + val * _d_a + 0 - _d_b + _d_c; +//CHECK-NEXT: double result = val * a + 100 - b + c; +//CHECK-NEXT: return _d_result; +//CHECK-NEXT:} + +consteval double fn_test() { + auto dx = clad::differentiate(fn, "a"); + + return dx.execute(4, 7); +} + +consteval double mul_test() { + auto dx = clad::differentiate(mul, "a"); + + return dx.execute(5, 6, 10); +} + +int main() { + constexpr double fn_result = fn_test(); + printf("%.2f\n", fn_result); // CHECK-EXEC: 0.50 + + constexpr double mul_result = mul_test(); + printf("%.2f\n", mul_result); // CHECK-EXEC: 99.00 +} diff --git a/test/ForwardMode/ConstexprTest.C b/test/ForwardMode/ConstexprTest.C new file mode 100644 index 000000000..a14f273f9 --- /dev/null +++ b/test/ForwardMode/ConstexprTest.C @@ -0,0 +1,62 @@ +// RUN: %cladclang %s -I%S/../../include -std=c++23 -oConstexprTest.out | %filecheck %s +// RUN: ./ConstexprTest.out | %filecheck_exec %s + +#include "clad/Differentiator/Differentiator.h" + +constexpr double fn(double a, double b) { + return (a+b)/2; +} + +//CHECK: constexpr double fn_darg0(double a, double b) { +//CHECK-NEXT: double _d_a = 1; +//CHECK-NEXT: double _d_b = 0; +//CHECK-NEXT: double _t0 = (a + b); +//CHECK-NEXT: return ((_d_a + _d_b) * 2 - _t0 * 0) / (2 * 2); +//CHECK-NEXT:} + +constexpr double mul(double a, double b, double c) { + double val = 99.00; + double result = val * a + 100 - b + c; + return result; +} + +//CHECK: constexpr double mul_darg0(double a, double b, double c) { +//CHECK-NEXT: double _d_a = 1; +//CHECK-NEXT: double _d_b = 0; +//CHECK-NEXT: double _d_c = 0; +//CHECK-NEXT: double _d_val = 0.; +//CHECK-NEXT: double val = 99.; +//CHECK-NEXT: double _d_result = _d_val * a + val * _d_a + 0 - _d_b + _d_c; +//CHECK-NEXT: double result = val * a + 100 - b + c; +//CHECK-NEXT: return _d_result; +//CHECK-NEXT:} + +constexpr double fn_test() { + if consteval { + auto dx = clad::differentiate(fn, "a"); + + return dx.execute(4, 7); + } else { + assert(false && "fn non-consteval context"); + return -42.; + } +} + +constexpr double mul_test() { + if consteval { + auto dx = clad::differentiate(mul, "a"); + + return dx.execute(5, 6, 10); + } else { + assert(false && "mul non-immediate context"); + return -42.; + } +} + +int main() { + constexpr double fn_result = fn_test(); + printf("%.2f\n", fn_result); // CHECK-EXEC: 0.50 + + constexpr double mul_result = mul_test(); + printf("%.2f\n", mul_result); // CHECK-EXEC: 99.0 +}