diff mbox

[Ada] Restrict SAL library names to Ada identifiers

Message ID 20110902094407.GA26732@adacore.com
State New
Headers show

Commit Message

Arnaud Charlet Sept. 2, 2011, 9:44 a.m. UTC
The Project Manager is now checking that the names of Stand-Alone
libraries have the syntax of Ada identifiers, so that the binder
generated files that contains unit and subprogram names derived from the
library name will compile. If this check fails, an error is reported and
the tool terminates its execution.
The test is to invoke gnatmake on a SAL project with a library name such
as "bad-name". An error should be reported by gnatmake and no further
processing should happen.

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

2011-09-02  Vincent Celier  <celier@adacore.com>

	* prj-nmsc.db: (Check_Stand_Alone_Library): For SALs, allow
	only library names with the syntax of Ada identifiers, to avoid errors
	when compiling the binder generated files.
	* projects.texi: Document restriction on SAL library names
diff mbox

Patch

Index: prj-nmsc.adb
===================================================================
--- prj-nmsc.adb	(revision 178448)
+++ prj-nmsc.adb	(working copy)
@@ -82,8 +82,7 @@ 
       Hash       => Hash,
       Equal      => "=");
    --  File name information found in string list attribute (Source_Files or
-   --  Source_List_File). Except is set to True if source is a naming exception
-   --  in the project. Used to check that all referenced files were indeed
+   --  Source_List_File). Used to check that all referenced files were indeed
    --  found on the disk.
 
    type Unit_Exception is record
@@ -4302,6 +4301,12 @@ 
    is
       Shared : constant Shared_Project_Tree_Data_Access := Data.Tree.Shared;
 
+      Lib_Name            : constant Prj.Variable_Value :=
+                              Prj.Util.Value_Of
+                               (Snames.Name_Library_Name,
+                                Project.Decl.Attributes,
+                                Shared);
+
       Lib_Interfaces      : constant Prj.Variable_Value :=
                               Prj.Util.Value_Of
                                 (Snames.Name_Library_Interface,
@@ -4353,7 +4358,45 @@ 
       --  Library_Interface is defined.
 
       if not Lib_Interfaces.Default then
+
+         --  The name of a stand-alone library needs to have the syntax of an
+         --  Ada identifier.
+
          declare
+            Name : constant String := Get_Name_String (Project.Library_Name);
+            OK   : Boolean := Is_Letter (Name (Name'First));
+            Underline : Boolean := False;
+         begin
+            for J in Name'First + 1 .. Name'Last loop
+               exit when not OK;
+
+               if Is_Alphanumeric (Name (J)) then
+                  Underline := False;
+
+               elsif Name (J) = '_' then
+                  if Underline then
+                     OK := False;
+                  else
+                     Underline := True;
+                  end if;
+
+               else
+                  OK := False;
+               end if;
+            end loop;
+
+            OK := OK and then not Underline;
+
+            if not OK then
+               Error_Msg
+                 (Data.Flags,
+                  "Incorrect library name for a Stand-Alone Library",
+                  Lib_Name.Location, Project);
+               return;
+            end if;
+         end;
+
+         declare
             Interfaces     : String_List_Id := Lib_Interfaces.Values;
             Interface_ALIs : String_List_Id := Nil_String;
             Unit           : Name_Id;
Index: projects.texi
===================================================================
--- projects.texi	(revision 178446)
+++ projects.texi	(working copy)
@@ -1,6 +1,7 @@ 
 @set gprconfig GPRconfig
 
 @c ------ projects.texi
+@c Copyright (C) 2002-2011, Free Software Foundation, Inc.
 @c This file is shared between the GNAT user's guide and gprbuild. It is not
 @c compilable on its own, you should instead compile the other two manuals.
 @c For that reason, there is no toplevel @menu
@@ -1525,10 +1526,11 @@ 
 @item @b{Library_Name}:
 @cindex @code{Library_Name}
   This attribute is the name of the library to be built. There is no
-  restriction on the name of a library imposed by the project manager;
-  however, there may be system specific restrictions on the name.
-  In general, it is recommended to stick to alphanumeric characters
-  (and possibly underscores) to help portability.
+  restriction on the name of a library imposed by the project manager, except
+  for stand-alone libraries whose names must follow the syntax of Ada
+  identifiers; however, there may be system specific restrictions on the name.
+  In general, it is recommended to stick to alphanumeric characters (and
+  possibly single underscores) to help portability.
 
 @item @b{Library_Dir}:
 @cindex @code{Library_Dir}
@@ -1749,6 +1751,9 @@ 
 Ada: they provide a means for minimizing relinking & redeployment of complex
 systems when localized changes are made.
 
+The name of a stand-alone library, specified with attribute
+@code{Library_Name}, must have the syntax of an Ada identifier.
+
 The most prominent characteristic of a stand-alone library is that it offers a
 distinction between interface units and implementation units. Only the former
 are visible to units outside the library. A stand-alone library project is thus