diff --git a/flang/lib/Evaluate/fold-logical.cpp b/flang/lib/Evaluate/fold-logical.cpp --- a/flang/lib/Evaluate/fold-logical.cpp +++ b/flang/lib/Evaluate/fold-logical.cpp @@ -106,6 +106,10 @@ } } } + } else if (name == "logical") { + if (auto *expr{UnwrapExpr>(args[0])}) { + return Fold(context, ConvertToType(std::move(*expr))); + } } else if (name == "merge") { return FoldMerge(context, std::move(funcRef)); } else if (name == "__builtin_ieee_support_datatype" || diff --git a/flang/test/Evaluate/folding01.f90 b/flang/test/Evaluate/folding01.f90 --- a/flang/test/Evaluate/folding01.f90 +++ b/flang/test/Evaluate/folding01.f90 @@ -30,6 +30,9 @@ logical, parameter :: test_neqv3 = .NOT.(.false..NEQV..false.) logical, parameter :: test_neqv4 = .NOT.(.true..NEQV..true.) + logical, parameter :: test_logical1 = logical(logical(.true., 2)) + logical, parameter :: test_logical2 = .NOT.logical(logical(.false., 2)) + ! Check integer intrinsic operator folding ! Check integer relational intrinsic operation folding