@@ -2639,6 +2639,10 @@ found:
expr->ts = sym->ts;
expr->value.function.name = sym->name;
expr->value.function.esym = sym;
+ /* Prevent crash when sym->ts.u.derived->components is not set due to previous
+ error(s). */
+ if (sym->ts.type == BT_CLASS && !CLASS_DATA (sym))
+ return MATCH_ERROR;
if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
expr->rank = CLASS_DATA (sym)->as->rank;
else if (sym->as != NULL)
new file mode 100644
@@ -0,0 +1,18 @@
+! { dg-do compile }
+! Check that the compiler reports the errors, but does not segfault.
+! Contributed by: Andre Vehreschild <vehre@gcc.gnu.org>
+!
+program test
+ implicit none
+ class(*), pointer :: P
+ class(*), allocatable :: P2
+
+ allocate(P2, source=convertType(P))
+
+contains
+
+ function convertType(in) ! { dg-error "must be dummy, allocatable or pointer" }
+ class(*), intent(in) :: in
+ class(*) :: convertType
+ end function
+end program test