Commit 9c870c90 by Arnaud Charlet

[multiple changes]

2010-10-11  Gary Dismukes  <dismukes@adacore.com>

	* sem_disp.adb (Check_Dispatching_Operation): Revise test for warning
	about nondispatching subprograms to use In_Same_List (reducing use of
	Parent links).

2010-10-11  Ed Schonberg  <schonberg@adacore.com>

	* xr_tabls.adb, sem_res.adb, lib-xref.adb, lib-xref.ads: Use s for
	reference in a static call.

2010-10-11  Steve Baird  <baird@adacore.com>

	* exp_attr.adb (Expand_N_Attribute_Reference, case Type_Key): Type_Key
	attribute should always be transformed into a string literal in
	Analyze_Attribute.
	* par-ch4.adb: Type_Key attribute's type is String; update value of
	Is_Parameterless_Attribute constant to reflect this.
	* sem_attr.adb (Analyze_Attribute): Recognize Type_Key attribute and
	rewrite it as a string literal (attribute value is always known
	statically).
	* snames.ads-tmpl: Add entries for Type_Key attribute.

From-SVN: r165285
parent 21a5b575
2010-10-11 Gary Dismukes <dismukes@adacore.com>
* sem_disp.adb (Check_Dispatching_Operation): Revise test for warning
about nondispatching subprograms to use In_Same_List (reducing use of
Parent links).
2010-10-11 Ed Schonberg <schonberg@adacore.com>
* xr_tabls.adb, sem_res.adb, lib-xref.adb, lib-xref.ads: Use s for
reference in a static call.
2010-10-11 Steve Baird <baird@adacore.com>
* exp_attr.adb (Expand_N_Attribute_Reference, case Type_Key): Type_Key
attribute should always be transformed into a string literal in
Analyze_Attribute.
* par-ch4.adb: Type_Key attribute's type is String; update value of
Is_Parameterless_Attribute constant to reflect this.
* sem_attr.adb (Analyze_Attribute): Recognize Type_Key attribute and
rewrite it as a string literal (attribute value is always known
statically).
* snames.ads-tmpl: Add entries for Type_Key attribute.
2010-10-11 Ed Schonberg <schonberg@adacore.com> 2010-10-11 Ed Schonberg <schonberg@adacore.com>
* lib-xref.adb (Output_References): Common handling for objects and * lib-xref.adb (Output_References): Common handling for objects and
......
...@@ -5355,6 +5355,7 @@ package body Exp_Attr is ...@@ -5355,6 +5355,7 @@ package body Exp_Attr is
Attribute_Stub_Type | Attribute_Stub_Type |
Attribute_Target_Name | Attribute_Target_Name |
Attribute_Type_Class | Attribute_Type_Class |
Attribute_Type_Key |
Attribute_Unconstrained_Array | Attribute_Unconstrained_Array |
Attribute_Universal_Literal_String | Attribute_Universal_Literal_String |
Attribute_Wchar_T_Size | Attribute_Wchar_T_Size |
......
...@@ -470,7 +470,7 @@ package body Lib.Xref is ...@@ -470,7 +470,7 @@ package body Lib.Xref is
and then Is_Ada_2005_Only (E) and then Is_Ada_2005_Only (E)
and then Ada_Version < Ada_2005 and then Ada_Version < Ada_2005
and then Warn_On_Ada_2005_Compatibility and then Warn_On_Ada_2005_Compatibility
and then (Typ = 'm' or else Typ = 'r') and then (Typ = 'm' or else Typ = 'r' or else Typ = 's')
then then
Error_Msg_NE ("& is only defined in Ada 2005?", N, E); Error_Msg_NE ("& is only defined in Ada 2005?", N, E);
end if; end if;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 1998-2009, Free Software Foundation, Inc. -- -- Copyright (C) 1998-2010, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -183,6 +183,7 @@ package Lib.Xref is ...@@ -183,6 +183,7 @@ package Lib.Xref is
-- P = overriding primitive operation -- P = overriding primitive operation
-- r = reference -- r = reference
-- R = subprogram reference in dispatching call -- R = subprogram reference in dispatching call
-- s = subprogram reference in a static call
-- t = end of body -- t = end of body
-- w = WITH line -- w = WITH line
-- x = type extension -- x = type extension
...@@ -296,6 +297,9 @@ package Lib.Xref is ...@@ -296,6 +297,9 @@ package Lib.Xref is
-- the specification of the primitive operation of the root -- the specification of the primitive operation of the root
-- type when the call has a controlling argument in its class. -- type when the call has a controlling argument in its class.
-- s is used to mark a static subprogram call. The reference is
-- to the specification of the subprogram being called.
-- t is similar to e. It identifies the end of a corresponding -- t is similar to e. It identifies the end of a corresponding
-- body (such a reference always links up with a b reference) -- body (such a reference always links up with a b reference)
......
...@@ -42,6 +42,7 @@ package body Ch4 is ...@@ -42,6 +42,7 @@ package body Ch4 is
Attribute_Base => True, Attribute_Base => True,
Attribute_Class => True, Attribute_Class => True,
Attribute_Stub_Type => True, Attribute_Stub_Type => True,
Attribute_Type_Key => True,
others => False); others => False);
-- This map contains True for parameterless attributes that return a -- This map contains True for parameterless attributes that return a
-- string or a type. For those attributes, a left parenthesis after -- string or a type. For those attributes, a left parenthesis after
......
...@@ -4449,6 +4449,48 @@ package body Sem_Attr is ...@@ -4449,6 +4449,48 @@ package body Sem_Attr is
Check_PolyORB_Attribute; Check_PolyORB_Attribute;
Set_Etype (N, RTE (RE_TypeCode)); Set_Etype (N, RTE (RE_TypeCode));
--------------
-- Type_Key --
--------------
when Attribute_Type_Key =>
Check_E0;
Check_Type;
declare
function Type_Key return String;
-- A very preliminary implementation.
-- For now, a signature consists of only the type name.
-- This is clearly incomplete (e.g., adding a new field to
-- a record type should change the type's Type_Key attribute).
--------------
-- Type_Key --
--------------
function Type_Key return String is
Full_Name : constant String_Id :=
Fully_Qualified_Name_String (Entity (P));
Signature : String
(1 .. Integer (String_Length (Full_Name)) - 1);
-- Decrement length to omit trailing NUL
begin
for J in Signature'Range loop
Signature (J) :=
Get_Character (Get_String_Char (Full_Name, Int (J)));
end loop;
return Signature & "'Type_Key";
end Type_Key;
begin
Rewrite (N, Make_String_Literal (Loc, Type_Key));
end;
Analyze_And_Resolve (N, Standard_String);
----------------- -----------------
-- UET_Address -- -- UET_Address --
----------------- -----------------
...@@ -7596,6 +7638,7 @@ package body Sem_Attr is ...@@ -7596,6 +7638,7 @@ package body Sem_Attr is
Attribute_Target_Name | Attribute_Target_Name |
Attribute_Terminated | Attribute_Terminated |
Attribute_To_Address | Attribute_To_Address |
Attribute_Type_Key |
Attribute_UET_Address | Attribute_UET_Address |
Attribute_Unchecked_Access | Attribute_Unchecked_Access |
Attribute_Universal_Literal_String | Attribute_Universal_Literal_String |
......
...@@ -1045,14 +1045,13 @@ package body Sem_Disp is ...@@ -1045,14 +1045,13 @@ package body Sem_Disp is
-- case it looks suspiciously like an attempt to define a primitive -- case it looks suspiciously like an attempt to define a primitive
-- operation, which requires the declaration to be in a package spec -- operation, which requires the declaration to be in a package spec
-- (3.2.3(6)). Only report cases where the type and subprogram are -- (3.2.3(6)). Only report cases where the type and subprogram are
-- in the same declaration list (by comparing the unit nodes reached -- in the same declaration list (by checking the enclosing parent
-- via Parent links), to avoid spurious warnings on subprograms in -- declarations), to avoid spurious warnings on subprograms in
-- instance bodies when the type is declared in the instance spec but -- instance bodies when the type is declared in the instance spec but
-- hasn't been frozen by the instance body. -- hasn't been frozen by the instance body.
elsif not Is_Frozen (Tagged_Type) elsif not Is_Frozen (Tagged_Type)
and then and then In_Same_List (Parent (Tagged_Type), Parent (Parent (Subp)))
Parent (Parent (Tagged_Type)) = Parent (Parent (Parent (Subp)))
then then
Error_Msg_N Error_Msg_N
("?not dispatching (must be defined in a package spec)", Subp); ("?not dispatching (must be defined in a package spec)", Subp);
......
...@@ -5527,10 +5527,10 @@ package body Sem_Res is ...@@ -5527,10 +5527,10 @@ package body Sem_Res is
then then
Generate_Reference (Nam, Subp, 'R'); Generate_Reference (Nam, Subp, 'R');
-- Normal case, not a dispatching call -- Normal case, not a dispatching call. Generate a call reference.
else else
Generate_Reference (Nam, Subp); Generate_Reference (Nam, Subp, 's');
end if; end if;
if Is_Intrinsic_Subprogram (Nam) then if Is_Intrinsic_Subprogram (Nam) then
......
...@@ -801,6 +801,7 @@ package Snames is ...@@ -801,6 +801,7 @@ package Snames is
Name_Terminated : constant Name_Id := N + $; Name_Terminated : constant Name_Id := N + $;
Name_To_Address : constant Name_Id := N + $; -- GNAT Name_To_Address : constant Name_Id := N + $; -- GNAT
Name_Type_Class : constant Name_Id := N + $; -- GNAT Name_Type_Class : constant Name_Id := N + $; -- GNAT
Name_Type_Key : constant Name_Id := N + $; -- GNAT
Name_UET_Address : constant Name_Id := N + $; -- GNAT Name_UET_Address : constant Name_Id := N + $; -- GNAT
Name_Unbiased_Rounding : constant Name_Id := N + $; Name_Unbiased_Rounding : constant Name_Id := N + $;
Name_Unchecked_Access : constant Name_Id := N + $; Name_Unchecked_Access : constant Name_Id := N + $;
...@@ -1316,6 +1317,7 @@ package Snames is ...@@ -1316,6 +1317,7 @@ package Snames is
Attribute_Terminated, Attribute_Terminated,
Attribute_To_Address, Attribute_To_Address,
Attribute_Type_Class, Attribute_Type_Class,
Attribute_Type_Key,
Attribute_UET_Address, Attribute_UET_Address,
Attribute_Unbiased_Rounding, Attribute_Unbiased_Rounding,
Attribute_Unchecked_Access, Attribute_Unchecked_Access,
......
...@@ -395,7 +395,8 @@ package body Xr_Tabls is ...@@ -395,7 +395,8 @@ package body Xr_Tabls is
begin begin
case Ref_Type is case Ref_Type is
when 'b' | 'c' | 'H' | 'm' | 'o' | 'r' | 'R' | 'i' | ' ' | 'x' => when 'b' | 'c' | 'H' | 'm' | 'o' | 'r' | 'R' |
's' | 'i' | ' ' | 'x' =>
null; null;
when 'l' | 'w' => when 'l' | 'w' =>
...@@ -463,7 +464,7 @@ package body Xr_Tabls is ...@@ -463,7 +464,7 @@ package body Xr_Tabls is
New_Ref.Next := Declaration.Body_Ref; New_Ref.Next := Declaration.Body_Ref;
Declaration.Body_Ref := New_Ref; Declaration.Body_Ref := New_Ref;
when 'r' | 'R' | 'H' | 'i' | 'l' | 'o' | ' ' | 'x' | 'w' => when 'r' | 'R' | 's' | 'H' | 'i' | 'l' | 'o' | ' ' | 'x' | 'w' =>
New_Ref.Next := Declaration.Ref_Ref; New_Ref.Next := Declaration.Ref_Ref;
Declaration.Ref_Ref := New_Ref; Declaration.Ref_Ref := New_Ref;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment