aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArnaud Charlet <charlet@gcc.gnu.org>2015-05-27 15:21:36 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2015-05-27 15:21:36 +0200
commit66371f94f55df849da15ffa9334868de99ac1f8c (patch)
treedbabfad685e11db4ddd93bf224893bbc8f7f4d70 /gcc
parent0c6826a52305c4dadad3da2882f708e80638f100 (diff)
downloadgcc-66371f94f55df849da15ffa9334868de99ac1f8c.zip
gcc-66371f94f55df849da15ffa9334868de99ac1f8c.tar.gz
gcc-66371f94f55df849da15ffa9334868de99ac1f8c.tar.bz2
[multiple changes]
2015-05-27 Ed Schonberg <schonberg@adacore.com> * sem_ch6.adb (Process_Formals): A non-private formal type that is a limited view does not have a list of private dependents. 2015-05-27 Ed Schonberg <schonberg@adacore.com> * exp_ch5.adb (Expand_N_Case_Statement): If the expression in the case statement is a compile-time known value, we look for a corresponding alternative to optimize the case statement into a single case. If the type has a static predicate and the expression does not satisfy the predicate, there is no legal alternative and this optimization is not applicable. Excecution is erroneous, or else if assertions are enabled, an exception will be raised earlier, at the point the expression is elaborated. 2015-05-27 Robert Dewar <dewar@adacore.com> * sem_elab.adb (Check_Internal_Call_Continue): Suppress warning on Finalize, Adjust, or Initialize if type involved has Warnings_Off set. 2015-05-27 Ed Schonberg <schonberg@adacore.com> * sem_aux.adb, sem_aux.ads (First_Discriminant): Return empty when applied to a type with no known discriminants. From-SVN: r223752
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog27
-rw-r--r--gcc/ada/exp_ch5.adb11
-rw-r--r--gcc/ada/sem_aux.adb7
-rw-r--r--gcc/ada/sem_aux.ads6
-rw-r--r--gcc/ada/sem_ch6.adb8
-rw-r--r--gcc/ada/sem_elab.adb26
6 files changed, 77 insertions, 8 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 0bce664..9d5222b 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,30 @@
+2015-05-27 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch6.adb (Process_Formals): A non-private formal type that
+ is a limited view does not have a list of private dependents.
+
+2015-05-27 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch5.adb (Expand_N_Case_Statement): If the expression in
+ the case statement is a compile-time known value, we look for a
+ corresponding alternative to optimize the case statement into a
+ single case. If the type has a static predicate and the expression
+ does not satisfy the predicate, there is no legal alternative and
+ this optimization is not applicable. Excecution is erroneous,
+ or else if assertions are enabled, an exception will be raised
+ earlier, at the point the expression is elaborated.
+
+2015-05-27 Robert Dewar <dewar@adacore.com>
+
+ * sem_elab.adb (Check_Internal_Call_Continue): Suppress
+ warning on Finalize, Adjust, or Initialize if type involved has
+ Warnings_Off set.
+
+2015-05-27 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_aux.adb, sem_aux.ads (First_Discriminant): Return empty when
+ applied to a type with no known discriminants.
+
2015-05-26 Robert Dewar <dewar@adacore.com>
* errout.ads, sem_ch4.adb, sem_ch6.adb: Minor reformatting.
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb
index ca6971e..7156c76 100644
--- a/gcc/ada/exp_ch5.adb
+++ b/gcc/ada/exp_ch5.adb
@@ -2586,9 +2586,16 @@ package body Exp_Ch5 is
begin
-- Check for the situation where we know at compile time which branch
- -- will be taken
+ -- will be taken.
- if Compile_Time_Known_Value (Expr) then
+ -- If the value is static but its subtype is predicated and the value
+ -- does not obey the predicate, the value is marked non-static, and
+ -- there can be no corresponding static alternative.
+
+ if Compile_Time_Known_Value (Expr)
+ and then (not Has_Predicates (Etype (Expr))
+ or else Is_Static_Expression (Expr))
+ then
Alt := Find_Static_Alternative (N);
-- Do not consider controlled objects found in a case statement which
diff --git a/gcc/ada/sem_aux.adb b/gcc/ada/sem_aux.adb
index 31644b0..32d5b1f 100644
--- a/gcc/ada/sem_aux.adb
+++ b/gcc/ada/sem_aux.adb
@@ -246,7 +246,12 @@ package body Sem_Aux is
Ent := Next_Entity (Ent);
end loop;
- pragma Assert (Ekind (Ent) = E_Discriminant);
+ -- Call may be on a private type with unknown discriminants, in which
+ -- case Ent is Empty, and as per the spec, we return Empty in this case.
+
+ -- Historical note: The revious assertion that Ent is a discriminant
+ -- was overly cautious and prevented application of this function in
+ -- SPARK applications.
return Ent;
end First_Discriminant;
diff --git a/gcc/ada/sem_aux.ads b/gcc/ada/sem_aux.ads
index 5268b01..db0931e 100644
--- a/gcc/ada/sem_aux.ads
+++ b/gcc/ada/sem_aux.ads
@@ -119,9 +119,9 @@ package Sem_Aux is
-- First_Entity. The exception arises for tagged types, where the tag
-- itself is prepended to the front of the entity chain, so the
-- First_Discriminant function steps past the tag if it is present.
- -- The caller is responsible for checking that the type has discriminants,
- -- so for example it is improper to call this function on a private
- -- type with unknown discriminants.
+ -- The caller is responsible for checking that the type has discriminants.
+ -- When called on a private type with unknown discriminants, the function
+ -- always returns Empty.
function First_Stored_Discriminant (Typ : Entity_Id) return Entity_Id;
-- Typ is a type with discriminants. Gives the first discriminant stored
diff --git a/gcc/ada/sem_ch6.adb b/gcc/ada/sem_ch6.adb
index 43cbffc..18a9b02 100644
--- a/gcc/ada/sem_ch6.adb
+++ b/gcc/ada/sem_ch6.adb
@@ -10117,9 +10117,13 @@ package body Sem_Ch6 is
(Parent (T), N_Access_Function_Definition,
N_Access_Procedure_Definition)
then
- if not Is_Class_Wide_Type (Formal_Type) then
+ -- A limited view has no private dependents
+
+ if not Is_Class_Wide_Type (Formal_Type)
+ and then not From_Limited_With (Formal_Type)
+ then
Append_Elmt (Current_Scope,
- Private_Dependents (Base_Type (Formal_Type)));
+ Private_Dependents (Base_Type (Formal_Type)));
end if;
-- Freezing is delayed to ensure that Register_Prim
diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb
index 07517bb..01fd0cd 100644
--- a/gcc/ada/sem_elab.adb
+++ b/gcc/ada/sem_elab.adb
@@ -2447,6 +2447,30 @@ package body Sem_Elab is
("instantiation of& may occur before body is seen<l<",
N, Orig_Ent);
else
+ -- A rather specific check. For Finalize/Adjust/Initialize,
+ -- if the type has Warnings_Off set, suppress the warning.
+
+ if Nam_In (Chars (E), Name_Adjust,
+ Name_Finalize,
+ Name_Initialize)
+ and then Present (First_Formal (E))
+ then
+ declare
+ T : constant Entity_Id := Etype (First_Formal (E));
+ begin
+ if Is_Controlled (T) then
+ if Warnings_Off (T)
+ or else (Ekind (T) = E_Private_Type
+ and then Warnings_Off (Full_View (T)))
+ then
+ goto Output;
+ end if;
+ end if;
+ end;
+ end if;
+
+ -- Go ahead and give warning if not this special case
+
Error_Msg_NE
("call to& may occur before body is seen<l<", N, Orig_Ent);
end if;
@@ -2458,6 +2482,8 @@ package body Sem_Elab is
-- all the clarification messages produces by Output_Calls must be
-- emitted unconditionally.
+ <<Output>>
+
Output_Calls (N, Check_Elab_Flag => False);
end if;
end if;