! 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