Hi All, Although PR87362 is marked as fixed, the error becomes rather more explicit with this patch, which I actually developed for PR102457.
Regtests on FC42/x86_64 - OK for mainline Paul
Change.Logs
Description: Binary data
diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index 1e91b57aa96..9fb04ac59c5 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -3952,6 +3952,16 @@ gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym, } } + if (kind_expr && kind_expr->expr_type == EXPR_VARIABLE + && kind_expr->ts.type != BT_INTEGER + && kind_expr->symtree->n.sym->ts.type != BT_INTEGER) + { + gfc_error ("The type parameter expression at %L must be of INTEGER " + "type and not %s", &kind_expr->where, + gfc_basic_typename (kind_expr->symtree->n.sym->ts.type)); + goto error_return; + } + /* Store the current parameter expressions in a temporary actual arglist 'list' so that they can be substituted in the corresponding expressions in the PDT instance. */ diff --git a/gcc/testsuite/gfortran.dg/pdt_44.f03 b/gcc/testsuite/gfortran.dg/pdt_44.f03 new file mode 100644 index 00000000000..459001cab09 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pdt_44.f03 @@ -0,0 +1,28 @@ +! { dg-do compile } +! +! Test the fix for PRs83762 and 102457, in which type parameter expressions that +! are not of INTEGER type were either not being diagnosed or were inadequately +! diagnosed. +! +! PR83762 +module bar + implicit none + type :: foo(n) + integer, len :: n=10 + end type foo +contains + subroutine main + type(foo(undefined)) :: x ! { dg-error "must be of INTEGER type and not UNKNOWN" } + end subroutine main +end module bar + +! PR102457 +subroutine s + real :: m = 2 + type t(n) + integer, len :: n = 1 + character(n*n) :: c + end type + type(t(m)) :: x ! { dg-error "must be of INTEGER type and not REAL" } + call h(x) +end diff --git a/gcc/testsuite/gfortran.dg/pr95090.f90 b/gcc/testsuite/gfortran.dg/pr95090.f90 index ec77802ec51..714802fcbd9 100644 --- a/gcc/testsuite/gfortran.dg/pr95090.f90 +++ b/gcc/testsuite/gfortran.dg/pr95090.f90 @@ -13,7 +13,7 @@ module m2345678901234567890123456789012345678901234567890123456789_123 contains subroutine s2345678901234567890123456789012345678901234567890123456789_123 type(t2345678901234567890123456789012345678901234567890123456789_123 & - (n2345678901234567890123456789012345678901234567890123456789_123)) :: & + (n2345678901234567890123456789012345678901234567890123456789_123 = 4)) :: & z2345678901234567890123456789012345678901234567890123456789_123 end end