Patchwork [Ada] Missing error on illegal expanded name

login
register
mail settings
Submitter Arnaud Charlet
Date June 14, 2010, 12:25 p.m.
Message ID <20100614122503.GA6740@adacore.com>
Download mbox | patch
Permalink /patch/55522/
State New
Headers show

Comments

Arnaud Charlet - June 14, 2010, 12:25 p.m.
If an expanded name P.S is illegal, and P is an open scope, we examine the
context to determine whether there is a compilation unit in the context, named
P, that may be hidden by the scope P, and specialize the error message if the
outer P does contain an entity named S. If there is no such entity, and there
is no other semantic error in the program, the reference was left unresolved but
no error message was emitted, leading to a back-end crash. This patch fixes ths
oversight by generating the proper error message.

Compiling the following must yield:

     b-a.adb:7:06: "Bar" not declared in "A"

package A is
   procedure Do_It;
end A;
---
package B is
   procedure Bla;
end B;
---
package B.A is
   procedure Foo;
end B.A;
---
with A;
package body B.A is
   procedure Foo is
   begin
      A.Bar;   -- ERROR
   end Foo;
end B.A;
--

Tested on x86_64-pc-linux-gnu, committed on trunk

2010-06-14  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch8.adb (Find_Expanded_Name): If a candidate compilation unit in
	the context does not have a homonym of the selector, emit default
	error message.

Patch

Index: sem_ch8.adb
===================================================================
--- sem_ch8.adb	(revision 160711)
+++ sem_ch8.adb	(working copy)
@@ -4785,11 +4785,17 @@  package body Sem_Ch8 is
                                 ("\use fully qualified name starting with"
                                   & " Standard to make& visible", N, H);
                               Error_Msg_Qual_Level := 0;
-                              exit;
+                              goto Done;
                            end if;
 
                            Next_Entity (Id);
                         end loop;
+
+                        --  If not found,  standard error message.
+
+                        Error_Msg_NE ("& not declared in&", N, Selector);
+
+                        <<Done>> null;
                      end;
 
                   else