From f9b0da8ad4fca7d2d40c3ad6eb2bf612402a00e3 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Sun, 4 May 2025 09:58:45 -0500 Subject: [PATCH] [flang][Evaluate] Restrict ConstantBase constructor overload ConstantBase has a constructor that takes a value of any type as an input: template ConstantBase(const T &). A derived type Constant is a member of many Expr classes (as an alternative in the member variant). When trying (erroneously) to create Expr from a wrong input, if the specific instance of Expr contains Constant, it's that constructor that will be instantiated, leading to cryptic and unexpected errors. Eliminate the constructor from overload for invalid input values to help produce more meaningful diagnostics. --- flang/include/flang/Evaluate/constant.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/flang/include/flang/Evaluate/constant.h b/flang/include/flang/Evaluate/constant.h index 6fc22e3b86aa2..d4c6601c37bca 100644 --- a/flang/include/flang/Evaluate/constant.h +++ b/flang/include/flang/Evaluate/constant.h @@ -110,8 +110,12 @@ class ConstantBase : public ConstantBounds { using Result = RESULT; using Element = ELEMENT; - template + // Constructor for creating ConstantBase from an actual value (i.e. + // literals, etc.) + template >> ConstantBase(const A &x, Result res = Result{}) : result_{res}, values_{x} {} + ConstantBase(ELEMENT &&x, Result res = Result{}) : result_{res}, values_{std::move(x)} {} ConstantBase(