https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119800
--- Comment #2 from kargls at comcast dot net ---
(In reply to kargls from comment #1)
> (In reply to Keith Refson from comment #0)
>
> >
> > I suggest at least issuing a warning to expect undefined run-time behaviour!
> >
>
> Here's a patch hidden behind -Wsurprising.
>
And now the patch. :-)
diff --git a/gcc/fortran/check.cc b/gcc/fortran/check.cc
index 9c66c25e059..9aef66b4616 100644
--- a/gcc/fortran/check.cc
+++ b/gcc/fortran/check.cc
@@ -6856,6 +6856,32 @@ gfc_check_transfer (gfc_expr *source, gfc_expr *mold,
gfc_expr *size)
if (!warn_surprising)
return true;
+ /* TRANSFER does not do a deep copy. So, if SOURCE contains an allocatable
+ or pointer component, then this can lead to undefined behavior. */
+
+ if (source->expr_type == EXPR_VARIABLE && source->ts.type == BT_DERIVED)
+ {
+ bool saw = false;
+ gfc_component *c;
+
+ for (c = source->ts.u.derived->components; c; c = c->next)
+ {
+ if (c->attr.allocatable || c->attr.pointer)
+ {
+ saw = true;
+ break;
+ }
+ }
+
+ if (saw)
+ gfc_warning (OPT_Wsurprising,
+ "SOURCE at %L contains an ALLOCATABLE or POINTER "
+ "component, which may lead to undefined behavior because "
+ "TRANSFER does not do a deep copy",
+ &source->where);
+ }
+
+
/* If we can't calculate the sizes, we cannot check any more.
Return true for that case. */