package pak1 is
   type T1 is interface;
   type T2 is tagged null record;
   x1: access T1'Class;
   x2: T2 := T2(T2'class(x1.all));  --OK
   x3: T2 := T2(x1.all);            --ERROR: not a valid type conversion
end pak1;

The declaration of x2 is a legal type conversion, because x1.all
and T2'class both have class-wide types, so RM 4.6(21/2) applies.

But the declaration of x3 isn't a legal type conversion because
T2 isn't classwide, so RM 4.6(24/2) applies instead, which doesn't
offer any reason for this to be legal.

GCC 4.3 fails to diagnose the violation of 4.6(24/2), instead
warning about null access values:

gcc-4.3 -c -gnat05 pak1.ads
pak1.ads:5:26: warning: null value not allowed here
pak1.ads:5:26: warning: "Constraint_Error" will be raised at run time
pak1.ads:6:17: warning: null value not allowed here
pak1.ads:6:17: warning: "Constraint_Error" will be raised at run time

Here, gcc seems to propagate x1's null value even before considering
whether the type conversions are legal.


-- 
           Summary: Illegal program not detected, RM 4.6(24/2)
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ada
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: ludovic at ludovic-brenta dot org


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

Reply via email to