http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46152

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2010.10.29 14:51:24
            Summary|ALLOCATE with type-spec     |[F03] ALLOCATE with
                   |fails for intrinsic types   |type-spec fails for
                   |                            |intrinsic types
     Ever Confirmed|0                           |1

--- Comment #15 from janus at gcc dot gnu.org 2010-10-29 14:51:24 UTC ---
(In reply to comment #14)
> The error message "is not an accessible derived type" make no
> sense to me.  In the testcase, the statement 'allocate(tx :: x(5))'
> appears and there is no other appearance of 'tx'.  There is
> no reason (imho) to assume that 'tx' was a derived type over
> some simple typographically error (ie., a syntax error).  In the
> following fixed-form program,
> 
>   program hmm
>   doubleprecision, allocatable :: x
>   allocate(doubleprecicion :: x)
>   end program hmm 
> 
> saying 'doubleprecicion' is inaccessible derived type seems odd.
> 
> match_type_spec() now simply looks at 'tx' and asks if is a
> derived type.  If yes, match_type_spec() returns MATCH_YES.  If no,
> then 'tx' is compared against the intrinsic types.  'tx' clearly
> is not an intrinsic to match_type_spec() returns MATCH_NO.

Agreed so far. So maybe one should add another error message there, saying that
there is an error in the type spec?!?

Currently the line you commented out in allocate_derived_1 gives:

allocate_derived_1.f90:35.13:

 allocate(tx :: x(5))  ! { dg-error "is not an accessible derived type" }
             1
Fehler: Allocate-object at (1) is not a nonprocedure pointer or an allocatable
variable

I think this error message is much more misleading than the previous one.


> Also note, the name of the function is match_type_spec(),
> I've removed these chunks of code
> 
> -      old_locus = gfc_current_locus;
> -      if (gfc_match (" :: ") != MATCH_YES)
> -       return MATCH_ERROR;
> -      gfc_current_locus = old_locus;
>        /* Enfore F03:C401.  */
>        if (ts->u.derived->attr.abstract)
>         {
> @@ -2771,8 +2776,6 @@ match_type_spec (gfc_typespec *ts)
>         }
>        return MATCH_YES;
>      }
> -  else if (m == MATCH_ERROR && gfc_match (" :: ") == MATCH_YES)
> -    return MATCH_ERROR;
> 
> that look for '::'.  The double-colon is not part of
> a type-spec.

Maybe the check for '::' should be left in there. In case a double colon is
being found and the preceding string can not be identified as a type spec, one
should throw an extra error (see above).


> Now, match_type_spec() can never return a MATCH_ERROR
> condition, which may mean the "is not an accessible derived type"
> message may never triggered. Yes, I think it may be dead code.  

Not sure. Will check.

Reply via email to