- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If a non-abstract extension of a abstract derived type fails to implement a deferred binding of the parent type, then ifort 16.0 (and earlier) issue a diagnostic without particularly useful source location information. If the parent type is in the same program unit as the extension with the missing binding, then the compiler will identify the binding in the parent, while if the parent type is in a different program unit, then no line location information is provided at all.
Could this be please changed so that the faulty non-abstract extension type is nominated by the error location.
For example:
MODULE p
IMPLICIT NONE
TYPE, ABSTRACT :: Parent
CONTAINS
PROCEDURE(intf), DEFERRED, NOPASS :: OOPSIMadeAMistake
END TYPE Parent
ABSTRACT INTERFACE
SUBROUTINE intf
END SUBROUTINE intf
END INTERFACE
END MODULE p
MODULE m
USE p
IMPLICIT NONE
TYPE, EXTENDS(Parent) :: A
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE A
TYPE, EXTENDS(Parent) :: B
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE B
TYPE, EXTENDS(Parent) :: C
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE C
TYPE, EXTENDS(Parent) :: D
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE D
TYPE, EXTENDS(Parent) :: E
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE E
TYPE, EXTENDS(Parent) :: F
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE F
TYPE, EXTENDS(Parent) :: G
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE G
TYPE, EXTENDS(Parent) :: H
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE H
TYPE, EXTENDS(Parent) :: I
CONTAINS
PROCEDURE, NOPASS :: O0PSIMadeAMistake => oops
END TYPE I
TYPE, EXTENDS(Parent) :: J
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE J
TYPE, EXTENDS(Parent) :: K
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE K
TYPE, EXTENDS(Parent) :: L
CONTAINS
PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
END TYPE L
CONTAINS
SUBROUTINE oops
END SUBROUTINE oops
END MODULE m
>ifort /check:all /warn:all /standard-semantics "2015-09-02 oops.f90" Intel(R) Visual Fortran Intel(R) 64 Compiler for applications running on Intel(R) 64, Version 16.0 Build 20150815 Copyright (C) 1985-2015 Intel Corporation. All rights reserved. 2015-09-02 oops.f90: error #8322: A deferred binding is inherited by non-abstract type; It must be overridden. [OOPSIMADEAMISTAKE] compilation aborted for 2015-09-02 oops.f90 (code 1)
Ta.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I must not have had enough coffee this morning - I can't spot the error. It looks to me as if all the extensions override the deferred binding. What am I overlooking?
As for location information, even if you have everything in the same program unit, the location points to the deferred binding which is not useful. I am sure we can do something better here, but I need to understand where the real problem is. Please help!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Steve, I think that's Ian's point :-)
(Hint: Check the declaration of subroutine I ... carefully)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Gfortran gives the line number (47), but the error message itself still had me scratching my head and rubbing my eyes. We need the help of a suitable font to see the problem.
cat -n naughtyian.f90 | grep -C2 47
45 PROCEDURE, NOPASS :: OOPSIMadeAMistake => oops
46 END TYPE H
47 TYPE, EXTENDS(Parent) :: I
48 CONTAINS
49 PROCEDURE, NOPASS :: O0PSIMadeAMistake => oops
^
|
|
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I understood Ian's point, my tired eyes didn't catch what the error was.
I'll definitely pass this on to the developers. Issue ID is DPD200375685.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Ok, here's what the next major release will say:
U591282.f90: error #8322: A deferred binding is inherited by non-abstract type; It must be overridden. [OOPSIMADEAMISTAKE] U591282.f90(47): error #6136: Derived-type declared must be ABSTRACT TYPE, EXTENDS(Parent) :: I ---------------------------^
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
W0nderful, thanks.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page