http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54301
Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |burnus at gcc dot gnu.org --- Comment #2 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-08-17 18:29:28 UTC --- (In reply to comment #1) > a) I don't see what prevents a function from returning a short lived > pointer Nothing - except that it is bad if the pointer target is gone at the instance of returning. Example: function f () result (ptr) integer, pointer :: ptr(:) integer, allocatable, target :: a(:) allocate(a(5)) ptr => a a = [1,2,3,4,5] end function (There is some closed as INVALID PR which used such a code; the code above is perfectly valid, one just may not dereference the returned function result.) Here, "ptr" is a perfectly valid pointer within "f", however, "f" returns as function result an "undefined" pointer. The program is perfectly valid, except, one may not access the returned function result – which is a bit pointless. Of course, the code works, if one reassociates "ptr" with some other target which lives longer; still it is a bad programming style and asks for trouble. That's the idea of the warning: Warn for questionable code. Similarly for (c): subroutine foo() integer, pointer :: ptr(:) ... call bar () ... contains subroutine bar () integer, target :: tgt(5) ptr => tgt end subroutine bar ... end subroutine foo That's perfectly valid, but a dangerous way of programming. It becomes more reliably if "tgt" has the SAVE attribute – but I believe that it is still invalid to access "tgt" outside of "bar". Note: I only talked about a local nonpointer target on the RHS for which one should warn. For instance: function foo(tgt) integer, target :: tgt integer, pointer :: foo foo => tgt end function is perfectly valid and sensible if the actual argument is either a pointer or a target. (It is also valid if the nonpointer actual argument has no target attribute, but then the function result is an undefined pointer.) Hence, we cannot warn for this case.