[Patch, Fortran, OOP] PR 56261: seg fault call procedure pointer on polymorphic array

Tobias Burnus burnus@net-b.de
Thu Apr 11 18:32:00 GMT 2013


Am 11.04.2013 16:23, schrieb Janus Weil:
>> [Btw, I also thought about doing a full "gfc_compare_interfaces" in
>> "resolve_global_procedure", but that would probably be too strict.]
> Comment to self: It's certainly more strict, but I think this is a
> good thing. I just tried it and in fact it catches a number of cases
> in the testsuite, which previously went unnoticed.

Comment to Janus: It should be possible to disable the error check, e.g. 
by making it a warning. That's actually what the current code does: By 
default, it only warns and does not print an error. Even the very picky 
NAG compiler allows (at least some) mismatches with -dirty. Cf.  
http://gcc.gnu.org/ml/fortran/2009-05/msg00253.html for one example.

Thus, I think one should be strict about the requires-explicit-interface 
diagnostic (= new code, using F90+), but for interface mismatch (= could 
be old Fortran 66 code),  it should be either disabled or - as currently 
- just be a warning.

Having a mismatch is invalid according to the standard, but I think we 
should continue to support old code (which might contain some 
mismatches); on the other hand, warning about mismatches should be done. 
(See gfc_errors_to_warnings calls in resolve_global_procedure.)

  * * *

Regarding your other patch - I haven't looked at the current patch:

-	    l1 = mpz_get_si (cl1->length->value.integer);
+		case -2:
+		  /* FIXME: Implement a warning for this case. */
+		  break;

I don't think that a warning makes sense:

function foo(n)
   character(len=n) :: foo
...

interface
   function foo(m)
     character(len=m) :: foo

looks perfectly valid but since m /= n, the dependency analysis will return -2. And I do not want to have a warning for it. As the values are magic numbers, please add a comment above "case:" to roughly explain what the value means, especially for "-2", for -1/1/-3 one could guess it.


+		default:
+		  gfc_internal_error ("resolve_global_procedure: Unexpected "
+				      "result %i of gfc_dep_compare_expr",
+				      compval);
+		  break;


Since it is unlikely to be hit: gcc_unreachable (); should do. It makes 
the file size smaller, avoids work for translators, and one already gets 
a backtrace for it.

Tobias



More information about the Gcc-patches mailing list