aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2024-11-14 14:57:19 -0800
committerGitHub <noreply@github.com>2024-11-14 14:57:19 -0800
commitebc0163cea1cb1ad44f9c438064a52df7e5fc517 (patch)
treea1d2bba0b3c6894989c3f6c8b19d9ab55232bf7a
parent2bc30f37ce7143fd30f21bd232e14aa787f6b08f (diff)
downloadllvm-ebc0163cea1cb1ad44f9c438064a52df7e5fc517.zip
llvm-ebc0163cea1cb1ad44f9c438064a52df7e5fc517.tar.gz
llvm-ebc0163cea1cb1ad44f9c438064a52df7e5fc517.tar.bz2
[flang] INT2 & INT8 can't be specific intrinsic functions (#115360)
I recently added support for the extension intrinsic functions INT2 and INT8, and took the shortcut of defining them as specific intrinsic functions that map to the standard INT() with hard-wired KIND= values for the result. This works fine for references to these functions, but leads to a compiler crash for an attempt to use their names in contexts other than calling them, since their argument types aren't restricted to single types and no concrete interface can be characterized for them. So move them out of the table of specific intrinsic functions and into the general table of intrinsics, and then handle them afterwards as if they had been INT(). Fixes https://github.com/llvm/llvm-project/issues/115324.
-rw-r--r--flang/lib/Evaluate/fold-integer.cpp2
-rw-r--r--flang/lib/Evaluate/intrinsics.cpp10
-rw-r--r--flang/test/Evaluate/int8.f906
3 files changed, 9 insertions, 9 deletions
diff --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp
index 594a614..0ad09d7 100644
--- a/flang/lib/Evaluate/fold-integer.cpp
+++ b/flang/lib/Evaluate/fold-integer.cpp
@@ -873,7 +873,7 @@ Expr<Type<TypeCategory::Integer, KIND>> FoldIntrinsicFunction(
} else {
DIE("first argument must be CHARACTER");
}
- } else if (name == "int") {
+ } else if (name == "int" || name == "int2" || name == "int8") {
if (auto *expr{UnwrapExpr<Expr<SomeType>>(args[0])}) {
return common::visit(
[&](auto &&x) -> Expr<T> {
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index a070c67..0d0e683 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -572,6 +572,10 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
DefaultingKIND},
KINDInt},
{"int", {{"a", AnyNumeric, Rank::elementalOrBOZ}, DefaultingKIND}, KINDInt},
+ {"int2", {{"a", AnyNumeric, Rank::elementalOrBOZ}},
+ TypePattern{IntType, KindCode::exactKind, 2}},
+ {"int8", {{"a", AnyNumeric, Rank::elementalOrBOZ}},
+ TypePattern{IntType, KindCode::exactKind, 8}},
{"int_ptr_kind", {}, DefaultInt, Rank::scalar},
{"ior", {{"i", OperandInt}, {"j", OperandInt, Rank::elementalOrBOZ}},
OperandInt},
@@ -1176,12 +1180,6 @@ static const SpecificIntrinsicInterface specificIntrinsicFunction[]{
// procedure pointer target.
{{"index", {{"string", DefaultChar}, {"substring", DefaultChar}},
DefaultInt}},
- {{"int2", {{"a", AnyNumeric, Rank::elementalOrBOZ}},
- TypePattern{IntType, KindCode::exactKind, 2}},
- "int"},
- {{"int8", {{"a", AnyNumeric, Rank::elementalOrBOZ}},
- TypePattern{IntType, KindCode::exactKind, 8}},
- "int"},
{{"isign", {{"a", DefaultInt}, {"b", DefaultInt}}, DefaultInt}, "sign"},
{{"jiabs", {{"a", TypePattern{IntType, KindCode::exactKind, 4}}},
TypePattern{IntType, KindCode::exactKind, 4}},
diff --git a/flang/test/Evaluate/int8.f90 b/flang/test/Evaluate/int8.f90
index ef8321f4..677f1b1 100644
--- a/flang/test/Evaluate/int8.f90
+++ b/flang/test/Evaluate/int8.f90
@@ -1,5 +1,7 @@
-! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s
+!RUN: not %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck %s
!CHECK: warning: REAL(4) to INTEGER(2) conversion overflowed
-!CHECK: PRINT *, 32767_2, 4000000000_8
print *, int2(4.e9), int8(4.e9)
+!CHECK: error: 'int2' is not an unrestricted specific intrinsic procedure
+!CHECK: error: 'int8' is not an unrestricted specific intrinsic procedure
+call foo(int2,int8)
end