[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.
This commit is contained in:
Peter Klausler
2024-11-14 14:57:19 -08:00
committed by GitHub
parent 2bc30f37ce
commit ebc0163cea
3 changed files with 9 additions and 9 deletions

View File

@@ -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> {

View File

@@ -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}},

View File

@@ -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