re PR ada/16098 (Illegal program not detected, RM 13.1(6))
authorSamuel Tardieu <sam@rfc1149.net>
Mon, 14 Apr 2008 12:11:06 +0000 (12:11 +0000)
committerSamuel Tardieu <sam@gcc.gnu.org>
Mon, 14 Apr 2008 12:11:06 +0000 (12:11 +0000)
    gcc/ada/
PR ada/16098
* sem_prag.adb (Error_Pragma_Ref): New.
(Process_Convention): Specialized message for non-local
subprogram renaming. Detect the problem in homonyms as well.

    gcc/testsuite/
PR ada/16098
* gnat.dg/specs/renamings.ads: New.

From-SVN: r134262

gcc/ada/ChangeLog
gcc/ada/sem_prag.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/specs/renamings.ads [new file with mode: 0644]

index 9905b15ac73f8de8094b997f0cf3487f999f1bee..cdfcdfe4f9fdd8c1e4d2c974dfc58fcad4141216 100644 (file)
@@ -1,3 +1,10 @@
+2008-04-14  Samuel Tardieu  <sam@rfc1149.net>
+
+       PR ada/16098
+       * sem_prag.adb (Error_Pragma_Ref): New.
+       (Process_Convention): Specialized message for non-local
+       subprogram renaming. Detect the problem in homonyms as well.
+
 2008-04-14  Samuel Tardieu  <sam@rfc1149.net>
 
        PR ada/15915
index b98e0044beb3c9ab14eab08be8ca73b0205c1fa2..8a9a2e91f1107116ff63dc62f5c42500c880293f 100644 (file)
@@ -521,6 +521,13 @@ package body Sem_Prag is
       --  reference the identifier. After placing the message, Pragma_Exit
       --  is raised.
 
+      procedure Error_Pragma_Ref (Msg : String; Ref : Entity_Id);
+      pragma No_Return (Error_Pragma_Ref);
+      --  Outputs error message for current pragma. The message may contain
+      --  a % that will be replaced with the pragma name. The parameter Ref
+      --  must be an entity whose name can be referenced by & and sloc by #.
+      --  After placing the message, Pragma_Exit is raised.
+
       function Find_Lib_Unit_Name return Entity_Id;
       --  Used for a library unit pragma to find the entity to which the
       --  library unit pragma applies, returns the entity found.
@@ -1700,6 +1707,18 @@ package body Sem_Prag is
          raise Pragma_Exit;
       end Error_Pragma_Arg_Ident;
 
+      ----------------------
+      -- Error_Pragma_Ref --
+      ----------------------
+
+      procedure Error_Pragma_Ref (Msg : String; Ref : Entity_Id) is
+      begin
+         Error_Msg_Name_1 := Pname;
+         Error_Msg_Sloc   := Sloc (Ref);
+         Error_Msg_NE (Msg, N, Ref);
+         raise Pragma_Exit;
+      end Error_Pragma_Ref;
+
       ------------------------
       -- Find_Lib_Unit_Name --
       ------------------------
@@ -2414,6 +2433,10 @@ package body Sem_Prag is
             if Nkind (Parent (Declaration_Node (E))) =
                                        N_Subprogram_Renaming_Declaration
             then
+               if Scope (E) /= Scope (Alias (E)) then
+                  Error_Pragma_Ref
+                    ("cannot apply pragma% to non-local renaming&#", E);
+               end if;
                E := Alias (E);
 
             elsif Nkind (Parent (E)) = N_Full_Type_Declaration
@@ -2547,6 +2570,12 @@ package body Sem_Prag is
                  and then Nkind (Original_Node (Parent (E1))) /=
                    N_Full_Type_Declaration
                then
+                  if Present (Alias (E1))
+                    and then Scope (E1) /= Scope (Alias (E1))
+                  then
+                     Error_Pragma_Ref
+                       ("cannot apply pragma% to non-local renaming&#", E1);
+                  end if;
                   Set_Convention_From_Pragma (E1);
 
                   if Prag_Id = Pragma_Import then
index a129d156362a5f86967b4719ccb77a42ce669636..5bb51e82d8ce55f18fa77338759c9b6c6b66b887 100644 (file)
@@ -1,3 +1,8 @@
+2008-04-14  Samuel Tardieu  <sam@rfc1149.net>
+
+       PR ada/16098
+       * gnat.dg/specs/renamings.ads: New.
+
 2008-04-14  Samuel Tardieu  <sam@rfc1149.net>
 
        PR ada/15915
diff --git a/gcc/testsuite/gnat.dg/specs/renamings.ads b/gcc/testsuite/gnat.dg/specs/renamings.ads
new file mode 100644 (file)
index 0000000..3b90827
--- /dev/null
@@ -0,0 +1,14 @@
+package Renamings is
+
+   package Inner is
+      procedure PI (X : Integer);
+   end Inner;
+
+   procedure P (X : Integer) renames Inner.PI;
+   procedure P (X : Float);
+   pragma Convention (C, P); -- { dg-error "non-local renaming" }
+
+   procedure Q (X : Float);
+   procedure Q (X : Integer) renames Inner.PI;
+   pragma Convention (C, Q); -- { dg-error "non-local renaming" }
+end Renamings;