From 8c4d2e8763976a0ee0a1afd7bfd05985c190a74c Mon Sep 17 00:00:00 2001 From: Jean Perier Date: Fri, 23 Aug 2019 03:36:29 -0700 Subject: [PATCH] [flang] Fix SELECTED_CHAR_KIND('DEFAULT') folding issue Fix issue flang-compiler/f18#676 The issue was that the 'DEFAULT' case was handled directly in fold.cc which did not lowercase/trim trailing space of the argument befaore comparing to "default". Modify the `Selected_char_kind` function to accept the default char kind as argument and to return it if the processed argument matches "default". Original-commit: flang-compiler/f18@14222ae9148af4f99f59e6f9f0b928baa2da0b10 Reviewed-on: https://github.com/flang-compiler/f18/pull/679 --- flang/lib/evaluate/fold.cc | 9 +++------ flang/lib/evaluate/type.cc | 4 +++- flang/lib/evaluate/type.h | 2 +- flang/test/evaluate/folding05.f90 | Bin 4710 -> 4943 bytes 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/flang/lib/evaluate/fold.cc b/flang/lib/evaluate/fold.cc index 337d77a..d6d21b7 100644 --- a/flang/lib/evaluate/fold.cc +++ b/flang/lib/evaluate/fold.cc @@ -810,12 +810,9 @@ Expr> FoldIntrinsicFunction( } else if (name == "selected_char_kind") { if (const auto *chCon{UnwrapExpr>>(args[0])}) { if (std::optional value{chCon->GetScalarValue()}) { - if (*value == "default") { - return Expr{ - context.defaults().GetDefaultKind(TypeCategory::Character)}; - } else { - return Expr{SelectedCharKind(*value)}; - } + int defaultKind{ + context.defaults().GetDefaultKind(TypeCategory::Character)}; + return Expr{SelectedCharKind(*value, defaultKind)}; } } } else if (name == "selected_int_kind") { diff --git a/flang/lib/evaluate/type.cc b/flang/lib/evaluate/type.cc index 881c827..7b6967e 100644 --- a/flang/lib/evaluate/type.cc +++ b/flang/lib/evaluate/type.cc @@ -257,7 +257,7 @@ bool SomeKind::operator==( return PointeeComparison(derivedTypeSpec_, that.derivedTypeSpec_); } -int SelectedCharKind(const std::string &s) { // 16.9.168 +int SelectedCharKind(const std::string &s, int defaultKind) { // 16.9.168 auto lower{parser::ToLowerCaseLetters(s)}; auto n{lower.size()}; while (n > 0 && lower[0] == ' ') { @@ -273,6 +273,8 @@ int SelectedCharKind(const std::string &s) { // 16.9.168 return 2; } else if (lower == "iso_10646" || lower == "ucs-4") { return 4; + } else if (lower == "default") { + return defaultKind; } else { return -1; } diff --git a/flang/lib/evaluate/type.h b/flang/lib/evaluate/type.h index f79f3b2..5ffb886 100644 --- a/flang/lib/evaluate/type.h +++ b/flang/lib/evaluate/type.h @@ -442,7 +442,7 @@ template struct TypeOfHelper { template using TypeOf = typename TypeOfHelper::type; -int SelectedCharKind(const std::string &); +int SelectedCharKind(const std::string &, int defaultKind); int SelectedIntKind(std::int64_t precision = 0); int SelectedRealKind( std::int64_t precision = 0, std::int64_t range = 0, std::int64_t radix = 2); diff --git a/flang/test/evaluate/folding05.f90 b/flang/test/evaluate/folding05.f90 index 6457aa464764d3a8eda39dc2d8168320a63a2884..1ee86891e76d1a386869543e33c1e6d676fff194 100644 GIT binary patch delta 197 zcmaE+a$apiw2-xeLS|k`YIsSssZWT4g8F1dK4H`3Y#oK1)I3`)O$-ByfhK^Jhx&x5b15i*3`qnU zSEModBDW|<3RoU!Oe3qD8KzA@&0q^tiZ%683-!S4