diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp index fc07b8d26aceb..7b4e6e245c945 100644 --- a/flang/lib/Semantics/check-call.cpp +++ b/flang/lib/Semantics/check-call.cpp @@ -207,16 +207,18 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy, dummy.attrs.test(characteristics::DummyDataObject::Attr::Pointer)}; bool dummyIsAllocatableOrPointer{dummyIsAllocatable || dummyIsPointer}; allowActualArgumentConversions &= !dummyIsAllocatableOrPointer; - if (allowActualArgumentConversions) { - ConvertIntegerActual(actual, dummy.type, actualType, messages); - } - bool typesCompatible{ + bool typesCompatibleWithIgnoreTKR{ (dummy.ignoreTKR.test(common::IgnoreTKR::Type) && (dummy.type.type().category() == TypeCategory::Derived || actualType.type().category() == TypeCategory::Derived || dummy.type.type().category() != actualType.type().category())) || (dummy.ignoreTKR.test(common::IgnoreTKR::Kind) && - dummy.type.type().category() == actualType.type().category()) || + dummy.type.type().category() == actualType.type().category())}; + allowActualArgumentConversions &= !typesCompatibleWithIgnoreTKR; + if (allowActualArgumentConversions) { + ConvertIntegerActual(actual, dummy.type, actualType, messages); + } + bool typesCompatible{typesCompatibleWithIgnoreTKR || dummy.type.type().IsTkCompatibleWith(actualType.type())}; if (!typesCompatible && dummy.type.Rank() == 0 && allowActualArgumentConversions) { diff --git a/flang/test/Semantics/ignore_tkr02.f90 b/flang/test/Semantics/ignore_tkr02.f90 index a56b92d6613aa..b7cb7233c0a41 100644 --- a/flang/test/Semantics/ignore_tkr02.f90 +++ b/flang/test/Semantics/ignore_tkr02.f90 @@ -17,21 +17,21 @@ subroutine sub4(j, k) !dir$ ignore_tkr(kr) k end end interface -!CHECK: CALL sub1(1_1,int(1_1,kind=4)) +!CHECK: CALL sub1(1_1,1_1) call generic(1_1,1_1) -!CHECK: CALL sub1(1_1,int(1_2,kind=4)) +!CHECK: CALL sub1(1_1,1_2) call generic(1_1,1_2) !CHECK: CALL sub1(1_1,[INTEGER(1)::1_1]) call generic(1_1,[1_1]) -!CHECK: CALL sub2(1_2,int(1_1,kind=4)) +!CHECK: CALL sub2(1_2,1_1) call generic(1_2,1_1) -!CHECK: CALL sub2(1_2,int(1_2,kind=4)) +!CHECK: CALL sub2(1_2,1_2) call generic(1_2,1_2) !CHECK: CALL sub2(1_2,[INTEGER(1)::1_1]) call generic(1_2,[1_1]) -!CHECK: CALL sub4(1_4,int(1_1,kind=4)) +!CHECK: CALL sub4(1_4,1_1) call generic(1_4,1_1) -!CHECK: CALL sub4(1_4,int(1_2,kind=4)) +!CHECK: CALL sub4(1_4,1_2) call generic(1_4,1_2) !CHECK: CALL sub4(1_4,[INTEGER(1)::1_1]) call generic(1_4,[1_1])