[flang-commits] [flang] ebc0163 - [flang] INT2 & INT8 can't be specific intrinsic functions (#115360)

via flang-commits flang-commits at lists.llvm.org
Thu Nov 14 14:57:22 PST 2024


Author: Peter Klausler
Date: 2024-11-14T14:57:19-08:00
New Revision: ebc0163cea1cb1ad44f9c438064a52df7e5fc517

URL: https://github.com/llvm/llvm-project/commit/ebc0163cea1cb1ad44f9c438064a52df7e5fc517
DIFF: https://github.com/llvm/llvm-project/commit/ebc0163cea1cb1ad44f9c438064a52df7e5fc517.diff

LOG: [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.

Added: 
    

Modified: 
    flang/lib/Evaluate/fold-integer.cpp
    flang/lib/Evaluate/intrinsics.cpp
    flang/test/Evaluate/int8.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Evaluate/fold-integer.cpp b/flang/lib/Evaluate/fold-integer.cpp
index 594a614a5f2e76..0ad09d76a6555d 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 a070c67c2bfb82..0d0e683eef23fc 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 ef8321f4c710b3..677f1b15a076a4 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


        


More information about the flang-commits mailing list