aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog33
-rw-r--r--gcc/ada/env.c4
-rw-r--r--gcc/ada/makeutl.adb2
-rw-r--r--gcc/ada/par-ch13.adb30
-rw-r--r--gcc/ada/par.adb4
-rw-r--r--gcc/ada/prj.adb9
-rw-r--r--gcc/ada/sem_attr.adb12
-rw-r--r--gcc/ada/sem_res.adb35
8 files changed, 111 insertions, 18 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index e9a5697..3aa9c77 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,38 @@
2011-08-04 Yannick Moy <moy@adacore.com>
+ * par-ch13.adb (Aspect_Specifications_Present): recognize
+ "with Identifier'Class =>" as an aspect, so that a meaningful warning
+ is issued in Strict mode.
+ * par.adb: Fix typos in comments.
+
+2011-08-04 Yannick Moy <moy@adacore.com>
+
+ * sem_attr.adb (Result): modify error message to take into account Post
+ aspect when compiling Ada 2012 (or newer) code.
+
+2011-08-04 Nicolas Roche <roche@adacore.com>
+
+ * env.c (__gnat_clearenv): Avoid use of dynamic size array in order to
+ remove need for GCC exceptions.
+
+2011-08-04 Vincent Celier <celier@adacore.com>
+
+ * makeutl.adb (Do_Complete): Call Debug_Output with the name of the
+ project, not the source file name.
+ * prj.adb (Find_Sources.Look_For_Sources): If the source has been
+ excluded, continue looking. This excluded source will only be returned
+ if there is no other source with the same base name that is not locally
+ removed.
+
+2011-08-04 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_res.adb (Resolve_Intrinsic_Operator): if the result type is
+ private and one of the operands is a real literal, use a qualified
+ expression rather than a conversion which is not meaningful to the
+ back-end.
+
+2011-08-04 Yannick Moy <moy@adacore.com>
+
* sem_ch13.adb (Aspect_Loop): when an aspect X and its classwise
corresponding aspect X'Class are allowed, proceed with analysis of the
aspect instead of skipping it.
diff --git a/gcc/ada/env.c b/gcc/ada/env.c
index dc18e4e..c58139a 100644
--- a/gcc/ada/env.c
+++ b/gcc/ada/env.c
@@ -316,10 +316,12 @@ void __gnat_clearenv (void) {
/* create a string that contains "name" */
size++;
{
- char expression[size];
+ char *expression;
+ expression = (char *) xmalloc (size * sizeof (char));
strncpy (expression, env[0], size);
expression[size - 1] = 0;
__gnat_unsetenv (expression);
+ free (expression);
}
}
#else
diff --git a/gcc/ada/makeutl.adb b/gcc/ada/makeutl.adb
index 16a245c..cced36f 100644
--- a/gcc/ada/makeutl.adb
+++ b/gcc/ada/makeutl.adb
@@ -1377,7 +1377,7 @@ package body Makeutl is
if Source /= No_Source then
Debug_Output ("Found main in project",
- Name_Id (Source.File));
+ Source.Project.Name);
Names.Table (J).File := Source.File;
Names.Table (J).Project := File.Project;
diff --git a/gcc/ada/par-ch13.adb b/gcc/ada/par-ch13.adb
index 099f0e4..ecbf58f 100644
--- a/gcc/ada/par-ch13.adb
+++ b/gcc/ada/par-ch13.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2010, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
-- --
-- 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- --
@@ -89,9 +89,9 @@ package body Ch13 is
Result := Token = Tok_Arrow;
end if;
- -- If earlier than Ada 2012, check for valid aspect identifier followed
- -- by an arrow, and consider that this is still an aspect specification
- -- so we give an appropriate message.
+ -- If earlier than Ada 2012, check for valid aspect identifier (possibly
+ -- completed with 'CLASS) followed by an arrow, and consider that this
+ -- is still an aspect specification so we give an appropriate message.
else
if Get_Aspect_Id (Token_Name) = No_Aspect then
@@ -100,10 +100,26 @@ package body Ch13 is
else
Scan; -- past aspect name
- if Token /= Tok_Arrow then
- Result := False;
+ Result := False;
- else
+ if Token = Tok_Arrow then
+ Result := True;
+
+ elsif Token = Tok_Apostrophe then
+ Scan; -- past apostrophe
+
+ if Token = Tok_Identifier
+ and then Token_Name = Name_Class
+ then
+ Scan; -- past CLASS
+
+ if Token = Tok_Arrow then
+ Result := True;
+ end if;
+ end if;
+ end if;
+
+ if Result then
Restore_Scan_State (Scan_State);
Error_Msg_SC ("|aspect specification is an Ada 2012 feature");
Error_Msg_SC ("\|unit must be compiled with -gnat2012 switch");
diff --git a/gcc/ada/par.adb b/gcc/ada/par.adb
index 32276c5..39b8387 100644
--- a/gcc/ada/par.adb
+++ b/gcc/ada/par.adb
@@ -858,8 +858,8 @@ function Par (Configuration_Pragmas : Boolean) return List_Id is
-- attempt at an aspect specification. The default is more strict for
-- Ada versions before Ada 2012 (where aspect specifications are not
-- permitted). Note: this routine never checks the terminator token
- -- for aspects so it does not matter whether the aspect speficiations
- -- are terminated by semicolon or some other character
+ -- for aspects so it does not matter whether the aspect specifications
+ -- are terminated by semicolon or some other character.
procedure P_Aspect_Specifications
(Decl : Node_Id;
diff --git a/gcc/ada/prj.adb b/gcc/ada/prj.adb
index 2f4dea1..62a3fa9 100644
--- a/gcc/ada/prj.adb
+++ b/gcc/ada/prj.adb
@@ -557,7 +557,14 @@ package body Prj is
and then (Index = 0 or else Element (Iterator).Index = Index)
then
Src := Element (Iterator);
- return;
+
+ -- If the source has been excluded, continue looking. We will
+ -- get the excluded source only if there is no other source
+ -- with the same base name that is not locally removed.
+
+ if not Element (Iterator).Locally_Removed then
+ return;
+ end if;
end if;
Next (Iterator);
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 240b281..d1f927a 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -4102,9 +4102,15 @@ package body Sem_Attr is
Analyze_And_Resolve (N, Etype (PS));
else
- Error_Attr
- ("% attribute can only appear" &
- " in function Postcondition pragma", P);
+ if Ada_Version >= Ada_2012 then
+ Error_Attr
+ ("% attribute can only appear" &
+ " in function Postcondition pragma or Post aspect", P);
+ else
+ Error_Attr
+ ("% attribute can only appear" &
+ " in function Postcondition pragma", P);
+ end if;
end if;
end if;
end Result;
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index f5bf368..294322d 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -5261,6 +5261,9 @@ package body Sem_Res is
-- decrease false positives, without losing too many good
-- warnings. The idea is that these previous statements
-- may affect global variables the procedure depends on.
+ -- We also exclude raise statements, that may arise from
+ -- constraint checks and are probably unrelated to the
+ -- intended control flow.
if Nkind (N) = N_Procedure_Call_Statement
and then Is_List_Member (N)
@@ -5270,7 +5273,10 @@ package body Sem_Res is
begin
P := Prev (N);
while Present (P) loop
- if Nkind (P) /= N_Assignment_Statement then
+ if not Nkind_In (P,
+ N_Assignment_Statement,
+ N_Raise_Constraint_Error)
+ then
exit Scope_Loop;
end if;
@@ -7026,6 +7032,28 @@ package body Sem_Res is
Arg1 : Node_Id;
Arg2 : Node_Id;
+ function Convert_Operand (Opnd : Node_Id) return Node_Id;
+ -- If the operand is a literal, it cannot be the expression in a
+ -- conversion. Use a qualified expression instead.
+
+ function Convert_Operand (Opnd : Node_Id) return Node_Id is
+ Loc : constant Source_Ptr := Sloc (Opnd);
+ Res : Node_Id;
+ begin
+ if Nkind_In (Opnd, N_Integer_Literal, N_Real_Literal) then
+ Res :=
+ Make_Qualified_Expression (Loc,
+ Subtype_Mark => New_Occurrence_Of (Btyp, Loc),
+ Expression => Relocate_Node (Opnd));
+ Analyze (Res);
+
+ else
+ Res := Unchecked_Convert_To (Btyp, Opnd);
+ end if;
+
+ return Res;
+ end Convert_Operand;
+
begin
-- We must preserve the original entity in a generic setting, so that
-- the legality of the operation can be verified in an instance.
@@ -7048,12 +7076,13 @@ package body Sem_Res is
-- type.
if Is_Private_Type (Typ) then
- Arg1 := Unchecked_Convert_To (Btyp, Left_Opnd (N));
+ Arg1 := Convert_Operand (Left_Opnd (N));
+ -- Unchecked_Convert_To (Btyp, Left_Opnd (N));
if Nkind (N) = N_Op_Expon then
Arg2 := Unchecked_Convert_To (Standard_Integer, Right_Opnd (N));
else
- Arg2 := Unchecked_Convert_To (Btyp, Right_Opnd (N));
+ Arg2 := Convert_Operand (Right_Opnd (N));
end if;
if Nkind (Arg1) = N_Type_Conversion then