diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -2320,18 +2320,18 @@ } } } - auto dc{characteristics::DummyArgument::FromActual( - std::move(kw), *expr, context)}; - if (!dc) { - common::die("INTERNAL: could not characterize intrinsic function " - "actual argument '%s'", + if (auto dc{characteristics::DummyArgument::FromActual( + std::move(kw), *expr, context)}) { + dummyArgs.emplace_back(std::move(*dc)); + if (d.typePattern.kindCode == KindCode::same && !sameDummyArg) { + sameDummyArg = j; + } + } else { // error recovery + messages.Say( + "Could not characterize intrinsic function actual argument '%s'"_err_en_US, expr->AsFortran().c_str()); return std::nullopt; } - dummyArgs.emplace_back(std::move(*dc)); - if (d.typePattern.kindCode == KindCode::same && !sameDummyArg) { - sameDummyArg = j; - } } else { CHECK(arg->GetAssumedTypeDummy()); dummyArgs.emplace_back(std::string{d.keyword}, diff --git a/flang/test/Semantics/associated.f90 b/flang/test/Semantics/associated.f90 --- a/flang/test/Semantics/associated.f90 +++ b/flang/test/Semantics/associated.f90 @@ -70,6 +70,8 @@ procedure(subrInt), pointer :: subProcPointer procedure(), pointer :: implicitProcPointer procedure(subrCannotBeCalledfromImplicit), pointer :: cannotBeCalledfromImplicitPointer + !ERROR: 'neverdeclared' must be an abstract interface or a procedure with an explicit interface + procedure(neverDeclared), pointer :: badPointer logical :: lVar type(t1) :: t1x type(t1), target :: t1xtarget @@ -210,5 +212,10 @@ lvar = associated(intPointerArr, targetIntArr([2,1])) !ERROR: TARGET= argument 'targetintcoarray[1_8]' may not have a vector subscript or coindexing lvar = associated(intPointerVar1, targetIntCoarray[1]) + !ERROR: 'neverdeclared' is not a procedure + !ERROR: Could not characterize intrinsic function actual argument 'badpointer' + !ERROR: 'neverdeclared' is not a procedure + !ERROR: Could not characterize intrinsic function actual argument 'badpointer' + lvar = associated(badPointer) end subroutine test end subroutine assoc