Opened 2 years ago
Last modified 2 years ago
#268 new defect
Downcasting against type parameter failed
Reported by: | f37yu | Owned by: | |
---|---|---|---|
Priority: | major | Component: | cfa-cc |
Version: | 1.0 | Keywords: | |
Cc: |
Description (last modified by )
Minimal reproduction:
forall (T) struct wrap { T elem; }; forall (T) void foo (wrap(T) x, T y) { } int main() { wrap(int) w{10}; foo (w, 2.0); // error? }
Change History (2)
comment:1 Changed 2 years ago by
Description: | modified (diff) |
---|
comment:2 Changed 2 years ago by
Note: See
TracTickets for help on using
tickets.
To clarify, this particular issue requires a tightly bound parameter T (exact match)
In the call T is forced to be bound to int, so we expect the 2.0 to be (implicitly) downcast to int, but the unify algorithm does not consider downcast as a possibility and only attempts to unify T=int with double (by arithmetic hierarchy) Since T cannot be changed to double it fails.
Actually, the box type is not necessary. We can achieve the tightly bound T by using a pointer instead: