| Submitter | Arnaud Charlet |
|---|---|
| Date | Oct. 13, 2011, 10:22 a.m. |
| Message ID | <20111013102241.GA18403@adacore.com> |
| Download | mbox | patch |
| Permalink | /patch/119403/ |
| State | New |
| Headers | show |
Comments
On 13 Oct 2011, at 11:22, Arnaud Charlet wrote: > An operator can be declared Import (Intrinsic) only if the current > view of the > operand type (s) is a numeric type. With this patch the compiler > properly > rejects the pragma if the operand type is private or incomplete. > > Compiling mysystem.ads must yield: > > mysystem.ads:3:13: intrinsic operator can only apply to numeric > types > mysystem.ads:7:13: intrinsic operator can only apply to numeric > types > mysystem.ads:7:18: invalid use of incomplete type "Self" > > --- > package Mysystem is > type A is private; > function "<" (Left, Right : A) return Boolean; > pragma Import (Intrinsic, "<"); > > type Self; > function "+" (X, Y : Self) return Boolean; > pragma Import (Intrinsic, "+"); > type Self is tagged null record; > private > type A is mod 2 ** 32; > end Mysystem; just out of curiosity, is there a reason why some of the changes applied say " x must do y " with an example - but the example is not made into a test-case? (apologies if this has already be discussed). Iain
Patch
Index: sem_intr.adb =================================================================== --- sem_intr.adb (revision 179894) +++ sem_intr.adb (working copy) @@ -317,7 +317,11 @@ return; end if; - if not Is_Numeric_Type (Underlying_Type (T1)) then + -- The type must be fully defined and numeric. + + if No (Underlying_Type (T1)) + or else not Is_Numeric_Type (Underlying_Type (T1)) + then Errint ("intrinsic operator can only apply to numeric types", E, N); end if; end Check_Intrinsic_Operator;