diff mbox

[Ada] Missing error on illegal expanded name

Message ID 20100614122503.GA6740@adacore.com
State New
Headers show

Commit Message

Arnaud Charlet June 14, 2010, 12:25 p.m. UTC
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.
diff mbox

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