| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Check for semantic errors in tokenize() subroutine calls |
| ! Based on Fortran 2023 standard requirements |
| |
| program test_tokenize_errors |
| implicit none |
| |
| ! Valid declarations for reference |
| character(:), allocatable :: tokens(:), separator(:) |
| integer, allocatable :: first(:), last(:) |
| character(20) :: string |
| character(5) :: set |
| |
| ! Invalid declarations for testing |
| integer :: int_scalar, int_array(10) |
| real :: real_scalar |
| character(10) :: fixed_tokens(10), fixed_separator(10) |
| integer :: fixed_first(10), fixed_last(10) |
| character(10) :: string_array(5) |
| character(5) :: set_array(5) |
| character(len=10, kind=2) :: wide_string, wide_set |
| character(len=10, kind=2), allocatable :: wide_tokens(:) |
| real, allocatable :: real_first(:), real_last(:) |
| logical, allocatable :: logical_array(:) |
| integer, allocatable :: first_2d(:,:), last_2d(:,:) |
| character(:), allocatable :: tokens_2d(:,:) |
| |
| type t_coarray |
| integer, allocatable :: a(:) |
| end type |
| type(t_coarray) :: coa[*] |
| integer, allocatable :: coindexed_first(:)[:] |
| integer, allocatable :: coindexed_last(:)[:] |
| character(:), allocatable :: coindexed_tokens(:)[:] |
| |
| !======================================================================== |
| ! Test Form 1: TOKENIZE(STRING, SET, TOKENS [, SEPARATOR]) |
| !======================================================================== |
| |
| ! Valid call (reference) |
| call tokenize("hello world", " ", tokens) |
| call tokenize(string, set, tokens, separator) |
| |
| !======================================================================== |
| ! Form 1: Wrong types for STRING argument |
| !======================================================================== |
| |
| !ERROR: Actual argument for 'string=' has bad type 'INTEGER(4)' |
| call tokenize(int_scalar, set, tokens) |
| |
| !ERROR: Actual argument for 'string=' has bad type 'REAL(4)' |
| call tokenize(real_scalar, set, tokens) |
| |
| !======================================================================== |
| ! Form 1: Wrong rank for STRING (must be scalar) |
| !======================================================================== |
| ! Fails |
| !ERROR: 'string=' argument has unacceptable rank 1 |
| call tokenize(string_array, set, tokens) |
| |
| !======================================================================== |
| ! Form 1: Wrong types for SET argument |
| !======================================================================== |
| |
| !ERROR: Actual argument for 'set=' has bad type 'INTEGER(4)' |
| call tokenize(string, int_scalar, tokens) |
| |
| !ERROR: Actual argument for 'set=' has bad type 'REAL(4)' |
| call tokenize(string, real_scalar, tokens) |
| |
| !======================================================================== |
| ! Form 1: Wrong rank for SET (must be scalar) |
| !======================================================================== |
| ! Fails |
| !ERROR: 'set=' argument has unacceptable rank 1 |
| call tokenize(string, set_array, tokens) |
| |
| !======================================================================== |
| ! Form 1: Wrong types for TOKENS argument |
| !======================================================================== |
| ! Fails |
| !ERROR: Actual argument for 'tokens=' has bad type 'INTEGER(4)' |
| call tokenize(string, set, int_array) |
| ! Fails |
| !ERROR: Actual argument for 'tokens=' has bad type 'REAL(4)' |
| call tokenize(string, set, real_first) |
| ! Fails |
| !ERROR: Actual argument for 'tokens=' has bad type 'LOGICAL(4)' |
| call tokenize(string, set, logical_array) |
| |
| !======================================================================== |
| ! Form 1: Wrong rank for TOKENS (must be rank-1 array) |
| !======================================================================== |
| ! Fails |
| !ERROR: 'tokens=' argument has unacceptable rank 0 |
| call tokenize(string, set, string) |
| ! Fails |
| !ERROR: 'tokens=' argument has unacceptable rank 2 |
| call tokenize(string, set, tokens_2d) |
| |
| !======================================================================== |
| ! Form 1: TOKENS must be allocatable |
| !======================================================================== |
| |
| !ERROR: 'tokens=' argument to 'tokenize' must be ALLOCATABLE |
| call tokenize(string, set, fixed_tokens) |
| |
| !======================================================================== |
| ! Form 1: Wrong types for optional SEPARATOR argument |
| !======================================================================== |
| ! Fails |
| !ERROR: Actual argument for 'separator=' has bad type 'INTEGER(4)' |
| call tokenize(string, set, tokens, int_array) |
| ! Fails |
| !ERROR: Actual argument for 'separator=' has bad type 'REAL(4)' |
| call tokenize(string, set, tokens, real_first) |
| |
| !======================================================================== |
| ! Form 1: Wrong rank for SEPARATOR (must be rank-1 array) |
| !======================================================================== |
| ! Fails |
| !ERROR: 'separator=' argument has unacceptable rank 0 |
| call tokenize(string, set, tokens, set) |
| |
| !======================================================================== |
| ! Form 1: SEPARATOR must be allocatable |
| !======================================================================== |
| |
| !ERROR: 'separator=' argument to 'tokenize' must be ALLOCATABLE |
| call tokenize(string, set, tokens, fixed_separator) |
| |
| !======================================================================== |
| ! Form 1: Character kind mismatches |
| !======================================================================== |
| ! Fails |
| ! wide_string (kind=2) becomes sameArg; set (kind=1) fails sameKind check |
| !ERROR: Actual argument for 'set=' has bad type or kind 'CHARACTER(KIND=1,LEN=5_8)' |
| call tokenize(wide_string, set, tokens) |
| ! Fails |
| !ERROR: Actual argument for 'set=' has bad type or kind 'CHARACTER(KIND=2,LEN=10_8)' |
| call tokenize(string, wide_set, tokens) |
| ! Fails |
| !ERROR: Actual argument for 'tokens=' has bad type or kind 'CHARACTER(KIND=2,LEN=10_8)' |
| call tokenize(string, set, wide_tokens) |
| |
| !======================================================================== |
| ! Test Form 2: TOKENIZE(STRING, SET, FIRST, LAST) |
| !======================================================================== |
| |
| ! Valid call (reference) |
| call tokenize("hello world", " ", first, last) |
| |
| !======================================================================== |
| ! Form 2: Wrong types for STRING argument (same as Form 1) |
| !======================================================================== |
| |
| !ERROR: Actual argument for 'string=' has bad type 'INTEGER(4)' |
| call tokenize(int_scalar, set, first, last) |
| |
| !======================================================================== |
| ! Form 2: Wrong types for SET argument (same as Form 1) |
| !======================================================================== |
| |
| !ERROR: Actual argument for 'set=' has bad type 'INTEGER(4)' |
| call tokenize(string, int_scalar, first, last) |
| |
| !======================================================================== |
| ! Form 2: Wrong types for FIRST argument |
| !======================================================================== |
| |
| !ERROR: Actual argument for 'first=' has bad type 'REAL(4)' |
| call tokenize(string, set, real_first, last) |
| |
| !ERROR: Actual argument for 'first=' has bad type 'LOGICAL(4)' |
| call tokenize(string, set, logical_array, last) |
| |
| !======================================================================== |
| ! Form 2: Wrong rank for FIRST (must be rank-1 array) |
| !======================================================================== |
| |
| !ERROR: 'first=' argument has unacceptable rank 0 |
| call tokenize(string, set, int_scalar, last) |
| |
| !ERROR: 'first=' argument has unacceptable rank 2 |
| call tokenize(string, set, first_2d, last) |
| |
| !======================================================================== |
| ! Form 2: FIRST must be allocatable |
| !======================================================================== |
| |
| !ERROR: 'first=' argument to 'tokenize' must be ALLOCATABLE |
| call tokenize(string, set, fixed_first, last) |
| |
| !======================================================================== |
| ! Form 2: Wrong types for LAST argument |
| !======================================================================== |
| |
| !ERROR: Actual argument for 'last=' has bad type 'REAL(4)' |
| call tokenize(string, set, first, real_first) |
| |
| !======================================================================== |
| ! Form 2: Wrong rank for LAST (must be rank-1 array) |
| !======================================================================== |
| |
| !ERROR: 'last=' argument has unacceptable rank 0 |
| call tokenize(string, set, first, int_scalar) |
| |
| !ERROR: 'last=' argument has unacceptable rank 2 |
| call tokenize(string, set, first, last_2d) |
| |
| !======================================================================== |
| ! Form 2: LAST must be allocatable |
| !======================================================================== |
| |
| !ERROR: 'last=' argument to 'tokenize' must be ALLOCATABLE |
| call tokenize(string, set, first, fixed_last) |
| |
| !======================================================================== |
| ! Argument count errors |
| !======================================================================== |
| |
| !ERROR: missing mandatory 'set=' argument |
| call tokenize(string) |
| ! Fails |
| !ERROR: missing mandatory 'tokens=' argument |
| call tokenize(string, set) |
| |
| !ERROR: too many actual arguments for intrinsic 'tokenize' |
| call tokenize(string, set, tokens, separator, first) |
| |
| !======================================================================== |
| ! Coindexed object restrictions (if applicable) |
| !======================================================================== |
| |
| ! Note: Coarray tests depend on whether the standard allows coindexed |
| ! objects for TOKENIZE. Uncomment if compiler version enforces this. |
| |
| ! !ERROR: 'first=' argument to 'tokenize' may not be a coindexed object |
| ! call tokenize(string, set, coindexed_first[1], last) |
| |
| ! !ERROR: 'last=' argument to 'tokenize' may not be a coindexed object |
| ! call tokenize(string, set, first, coindexed_last[1]) |
| |
| ! !ERROR: 'tokens=' argument to 'tokenize' may not be a coindexed object |
| ! call tokenize(string, set, coindexed_tokens[1]) |
| |
| !======================================================================== |
| ! Keyword argument errors |
| !======================================================================== |
| |
| !ERROR: unknown keyword argument to intrinsic 'tokenize' |
| call tokenize(string, set, tokens, invalid_keyword=separator) |
| ! Fails |
| !ERROR: Actual argument for 'tokens=' has bad type 'INTEGER(4)' |
| call tokenize(string=string, set=set, tokens=first, separator=separator) |
| |
| !======================================================================== |
| ! Type/kind inconsistency between STRING, SET, TOKENS, SEPARATOR |
| !======================================================================== |
| |
| ! All character arguments must have the same kind (but can have different lengths) |
| ! This is implicitly handled by SameCharNoLen in the intrinsic definition |
| ! Fails |
| !ERROR: Actual argument for 'set=' has bad type or kind 'CHARACTER(KIND=2,LEN=10_8)' |
| call tokenize(string=string, set=wide_set, tokens=tokens) |
| |
| end program test_tokenize_errors |