@@ -429,6 +429,35 @@ caf_runtime_error (const char *message, ...)
429
429
exit (EXIT_FAILURE );
430
430
}
431
431
432
+ /* Error handling is similar everytime. Keep in sync with single.c, too. */
433
+ static void
434
+ caf_internal_error (const char * msg , int * stat , char * errmsg ,
435
+ size_t errmsg_len , ...)
436
+ {
437
+ va_list args ;
438
+ va_start (args , errmsg_len );
439
+ if (stat )
440
+ {
441
+ * stat = 1 ;
442
+ if (errmsg_len > 0 )
443
+ {
444
+ int len = snprintf (errmsg , errmsg_len , msg , args );
445
+ if (len >= 0 && errmsg_len > (size_t ) len )
446
+ memset (& errmsg [len ], ' ' , errmsg_len - len );
447
+ }
448
+ va_end (args );
449
+ return ;
450
+ }
451
+ else
452
+ {
453
+ fprintf (stderr , "Fortran runtime error on image %d: " , caf_this_image );
454
+ vfprintf (stderr , msg , args );
455
+ fprintf (stderr , "\n" );
456
+ }
457
+ va_end (args );
458
+ exit (EXIT_FAILURE );
459
+ }
460
+
432
461
/* Forward declaration of the feature unsupported message for failed images
433
462
* functions. */
434
463
static void
@@ -4704,7 +4733,7 @@ case kind: \
4704
4733
KINDCASE (16 , __int128 );
4705
4734
#endif
4706
4735
default :
4707
- caf_runtime_error (vecrefunknownkind , stat , NULL , 0 );
4736
+ caf_internal_error (vecrefunknownkind , stat , NULL , 0 );
4708
4737
return ;
4709
4738
}
4710
4739
#undef KINDCASE
@@ -4750,7 +4779,7 @@ case kind: \
4750
4779
* in a dimension. */
4751
4780
break ;
4752
4781
default :
4753
- caf_runtime_error (unknownarrreftype , stat , NULL , 0 );
4782
+ caf_internal_error (unknownarrreftype , stat , NULL , 0 );
4754
4783
return ;
4755
4784
}
4756
4785
dprint ("i = %zd, array_ref = %s, delta = %ld, in_array_ref = %d, arr_ext_fixed = %d, realloc_required = %d\n" , i ,
@@ -4762,7 +4791,7 @@ case kind: \
4762
4791
if (delta > 1 && dst_rank == 0 )
4763
4792
{
4764
4793
/* No, an array is required, but not provided. */
4765
- caf_runtime_error (extentoutofrange , stat , NULL , 0 );
4794
+ caf_internal_error (extentoutofrange , stat , NULL , 0 );
4766
4795
return ;
4767
4796
}
4768
4797
/* When dst is an array. */
@@ -4772,7 +4801,7 @@ case kind: \
4772
4801
* only by scalar data. */
4773
4802
if (dst_cur_dim >= dst_rank && delta != 1 )
4774
4803
{
4775
- caf_runtime_error (rankoutofrange , stat , NULL , 0 );
4804
+ caf_internal_error (rankoutofrange , stat , NULL , 0 );
4776
4805
return ;
4777
4806
}
4778
4807
/* Do further checks, when the source is not scalar. */
@@ -4810,7 +4839,7 @@ case kind: \
4810
4839
}
4811
4840
else
4812
4841
{
4813
- caf_runtime_error (doublearrayref , stat , NULL , 0 );
4842
+ caf_internal_error (doublearrayref , stat , NULL , 0 );
4814
4843
return ;
4815
4844
}
4816
4845
}
@@ -4825,7 +4854,7 @@ case kind: \
4825
4854
/* Check whether dst is reallocatable. */
4826
4855
if (unlikely (!dst_reallocatable ))
4827
4856
{
4828
- caf_runtime_error (nonallocextentmismatch , stat ,
4857
+ caf_internal_error (nonallocextentmismatch , stat ,
4829
4858
NULL , 0 , delta ,
4830
4859
GFC_DESCRIPTOR_EXTENT (dst , dst_cur_dim ));
4831
4860
return ;
@@ -4834,7 +4863,7 @@ case kind: \
4834
4863
* which is not allowed. */
4835
4864
else if (!dst_reallocatable && extent_mismatch )
4836
4865
{
4837
- caf_runtime_error (extentoutofrange , stat , NULL , 0 );
4866
+ caf_internal_error (extentoutofrange , stat , NULL , 0 );
4838
4867
return ;
4839
4868
}
4840
4869
realloc_needed = true;
@@ -4892,7 +4921,7 @@ case kind: \
4892
4921
KINDCASE (16 , __int128 );
4893
4922
#endif
4894
4923
default :
4895
- caf_runtime_error (vecrefunknownkind , stat , NULL , 0 );
4924
+ caf_internal_error (vecrefunknownkind , stat , NULL , 0 );
4896
4925
return ;
4897
4926
}
4898
4927
#undef KINDCASE
@@ -4923,7 +4952,7 @@ case kind: \
4923
4952
* not occur here. */
4924
4953
case CAF_ARR_REF_OPEN_START :
4925
4954
default :
4926
- caf_runtime_error (unknownarrreftype , stat , NULL , 0 );
4955
+ caf_internal_error (unknownarrreftype , stat , NULL , 0 );
4927
4956
return ;
4928
4957
}
4929
4958
dprint ("i = %zd, array_ref = %s, delta = %ld\n" ,
@@ -4935,7 +4964,7 @@ case kind: \
4935
4964
if (delta > 1 && dst_rank == 0 )
4936
4965
{
4937
4966
/* No, an array is required, but not provided. */
4938
- caf_runtime_error (extentoutofrange , stat , NULL , 0 );
4967
+ caf_internal_error (extentoutofrange , stat , NULL , 0 );
4939
4968
return ;
4940
4969
}
4941
4970
/* When dst is an array. */
@@ -4945,7 +4974,7 @@ case kind: \
4945
4974
* only by scalar data. */
4946
4975
if (dst_cur_dim >= dst_rank && delta != 1 )
4947
4976
{
4948
- caf_runtime_error (rankoutofrange , stat , NULL , 0 );
4977
+ caf_internal_error (rankoutofrange , stat , NULL , 0 );
4949
4978
return ;
4950
4979
}
4951
4980
/* Do further checks, when the source is not scalar. */
@@ -4966,7 +4995,7 @@ case kind: \
4966
4995
}
4967
4996
else
4968
4997
{
4969
- caf_runtime_error (doublearrayref , stat , NULL , 0 );
4998
+ caf_internal_error (doublearrayref , stat , NULL , 0 );
4970
4999
return ;
4971
5000
}
4972
5001
}
@@ -4981,7 +5010,7 @@ case kind: \
4981
5010
/* Check whether dst is reallocatable. */
4982
5011
if (unlikely (!dst_reallocatable ))
4983
5012
{
4984
- caf_runtime_error (nonallocextentmismatch , stat ,
5013
+ caf_internal_error (nonallocextentmismatch , stat ,
4985
5014
NULL , 0 , delta ,
4986
5015
GFC_DESCRIPTOR_EXTENT (dst , dst_cur_dim ));
4987
5016
return ;
@@ -4990,7 +5019,7 @@ case kind: \
4990
5019
* which is not allowed. */
4991
5020
else if (!dst_reallocatable && extent_mismatch )
4992
5021
{
4993
- caf_runtime_error (extentoutofrange , stat , NULL , 0 );
5022
+ caf_internal_error (extentoutofrange , stat , NULL , 0 );
4994
5023
return ;
4995
5024
}
4996
5025
realloc_needed = true;
@@ -5024,7 +5053,7 @@ case kind: \
5024
5053
}
5025
5054
break ;
5026
5055
default :
5027
- caf_runtime_error (unknownreftype , stat , NULL , 0 );
5056
+ caf_internal_error (unknownreftype , stat , NULL , 0 );
5028
5057
return ;
5029
5058
}
5030
5059
src_size = riter -> item_size ;
@@ -5052,7 +5081,7 @@ case kind: \
5052
5081
dst -> base_addr = malloc (size * GFC_DESCRIPTOR_SIZE (dst ));
5053
5082
if (unlikely (dst -> base_addr == NULL ))
5054
5083
{
5055
- caf_runtime_error (cannotallocdst , stat , size * GFC_DESCRIPTOR_SIZE (dst ));
5084
+ caf_internal_error (cannotallocdst , stat , NULL , 0 , size * GFC_DESCRIPTOR_SIZE (dst ));
5056
5085
return ;
5057
5086
}
5058
5087
}
@@ -5911,7 +5940,7 @@ case kind: \
5911
5940
KINDCASE (16 , __int128 );
5912
5941
#endif
5913
5942
default :
5914
- caf_runtime_error (vecrefunknownkind , stat , NULL , 0 );
5943
+ caf_internal_error (vecrefunknownkind , stat , NULL , 0 );
5915
5944
return ;
5916
5945
}
5917
5946
#undef KINDCASE
@@ -5957,7 +5986,7 @@ case kind: \
5957
5986
* a dimension. */
5958
5987
break ;
5959
5988
default :
5960
- caf_runtime_error (unknownarrreftype , stat , NULL , 0 );
5989
+ caf_internal_error (unknownarrreftype , stat , NULL , 0 );
5961
5990
return ;
5962
5991
} // switch
5963
5992
dprint ("i = %zd, array_ref = %s, delta = %ld\n" ,
@@ -5971,7 +6000,7 @@ case kind: \
5971
6000
if (delta > 1 && dst_rank == 0 )
5972
6001
{
5973
6002
/* No, an array is required, but not provided. */
5974
- caf_runtime_error (extentoutofrange , stat , NULL , 0 );
6003
+ caf_internal_error (extentoutofrange , stat , NULL , 0 );
5975
6004
return ;
5976
6005
}
5977
6006
/* When dst is an array. */
@@ -5981,7 +6010,7 @@ case kind: \
5981
6010
* only by scalar data. */
5982
6011
if (src_cur_dim >= dst_rank && delta != 1 )
5983
6012
{
5984
- caf_runtime_error (rankoutofrange , stat , NULL , 0 );
6013
+ caf_internal_error (rankoutofrange , stat , NULL , 0 );
5985
6014
return ;
5986
6015
}
5987
6016
/* Do further checks, when the source is not scalar. */
@@ -5998,7 +6027,7 @@ case kind: \
5998
6027
/* Check whether dst is reallocatable. */
5999
6028
if (unlikely (!dst_reallocatable ))
6000
6029
{
6001
- caf_runtime_error (nonallocextentmismatch , stat ,
6030
+ caf_internal_error (nonallocextentmismatch , stat ,
6002
6031
NULL , 0 , delta ,
6003
6032
GFC_DESCRIPTOR_EXTENT (dst , src_cur_dim ));
6004
6033
return ;
@@ -6007,7 +6036,7 @@ case kind: \
6007
6036
* modified, which is not allowed. */
6008
6037
else if (!dst_reallocatable && extent_mismatch )
6009
6038
{
6010
- caf_runtime_error (extentoutofrange , stat , NULL , 0 );
6039
+ caf_internal_error (extentoutofrange , stat , NULL , 0 );
6011
6040
return ;
6012
6041
}
6013
6042
dprint ("extent(dst, %d): %zd != delta: %ld.\n" , src_cur_dim ,
@@ -6047,7 +6076,7 @@ case kind: \
6047
6076
KINDCASE (16 , __int128 );
6048
6077
#endif
6049
6078
default :
6050
- caf_runtime_error (vecrefunknownkind , stat , NULL , 0 );
6079
+ caf_internal_error (vecrefunknownkind , stat , NULL , 0 );
6051
6080
return ;
6052
6081
}
6053
6082
#undef KINDCASE
@@ -6077,7 +6106,7 @@ case kind: \
6077
6106
* can not occur here. */
6078
6107
case CAF_ARR_REF_OPEN_START :
6079
6108
default :
6080
- caf_runtime_error (unknownarrreftype , stat , NULL , 0 );
6109
+ caf_internal_error (unknownarrreftype , stat , NULL , 0 );
6081
6110
return ;
6082
6111
} // switch
6083
6112
dprint ("i = %zd, array_ref = %s, delta = %ld\n" ,
@@ -6091,7 +6120,7 @@ case kind: \
6091
6120
if (delta > 1 && dst_rank == 0 )
6092
6121
{
6093
6122
/* No, an array is required, but not provided. */
6094
- caf_runtime_error (extentoutofrange , stat , NULL , 0 );
6123
+ caf_internal_error (extentoutofrange , stat , NULL , 0 );
6095
6124
return ;
6096
6125
}
6097
6126
/* When dst is an array. */
@@ -6101,7 +6130,7 @@ case kind: \
6101
6130
* only by scalar data. */
6102
6131
if (src_cur_dim >= dst_rank && delta != 1 )
6103
6132
{
6104
- caf_runtime_error (rankoutofrange , stat , NULL , 0 );
6133
+ caf_internal_error (rankoutofrange , stat , NULL , 0 );
6105
6134
return ;
6106
6135
}
6107
6136
/* Do further checks, when the source is not scalar. */
@@ -6115,7 +6144,7 @@ case kind: \
6115
6144
* the extent does not match the needed one. */
6116
6145
if (realloc_dst || extent_mismatch )
6117
6146
{
6118
- caf_runtime_error (unabletoallocdst , stat );
6147
+ caf_internal_error (unabletoallocdst , stat , NULL , 0 );
6119
6148
return ;
6120
6149
}
6121
6150
}
@@ -6127,7 +6156,7 @@ case kind: \
6127
6156
in_array_ref = false;
6128
6157
break ;
6129
6158
default :
6130
- caf_runtime_error (unknownreftype , stat , NULL , 0 );
6159
+ caf_internal_error (unknownreftype , stat , NULL , 0 );
6131
6160
return ;
6132
6161
}
6133
6162
dst_size = riter -> item_size ;
@@ -6142,7 +6171,7 @@ case kind: \
6142
6171
6143
6172
if (realloc_dst )
6144
6173
{
6145
- caf_runtime_error (unabletoallocdst , stat );
6174
+ caf_internal_error (unabletoallocdst , stat , NULL , 0 );
6146
6175
return ;
6147
6176
}
6148
6177
@@ -6177,7 +6206,7 @@ case kind: \
6177
6206
temp_src .base .base_addr = malloc (cap );
6178
6207
if (temp_src .base .base_addr == NULL )
6179
6208
{
6180
- caf_runtime_error (cannotallocdst , stat , NULL , cap );
6209
+ caf_internal_error (cannotallocdst , stat , NULL , cap );
6181
6210
return ;
6182
6211
}
6183
6212
}
0 commit comments