aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2017-01-06 11:24:02 +0000
committerArnaud Charlet <charlet@gcc.gnu.org>2017-01-06 12:24:02 +0100
commit9ca67d3f24e7386cf89c2ce2095677cd0e4c87de (patch)
tree7f03c7a1cc81cdacb953ca528df650d4eb61fde6 /gcc
parent5e127570e2871666c51d6c27a05cc3297030a823 (diff)
downloadgcc-9ca67d3f24e7386cf89c2ce2095677cd0e4c87de.zip
gcc-9ca67d3f24e7386cf89c2ce2095677cd0e4c87de.tar.gz
gcc-9ca67d3f24e7386cf89c2ce2095677cd0e4c87de.tar.bz2
exp_ch6.adb (Expand_Protected_Subprogram_Call): Add guard to better detect call within an entry_wrapper.
2017-01-06 Ed Schonberg <schonberg@adacore.com> * exp_ch6.adb (Expand_Protected_Subprogram_Call): Add guard to better detect call within an entry_wrapper. * sem_res.adb (Resolve_Call): A protected call within an entity_wrapper is analyzed in the context of the protected object but corresponds to a pre-analysis and is not an access before elaboration. * sem_attr.adb: Minor reformatting. From-SVN: r244139
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog10
-rw-r--r--gcc/ada/exp_ch6.adb1
-rw-r--r--gcc/ada/sem_attr.adb23
-rw-r--r--gcc/ada/sem_res.adb4
4 files changed, 28 insertions, 10 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 71f2ada..5419627 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,13 @@
+2017-01-06 Ed Schonberg <schonberg@adacore.com>
+
+ * exp_ch6.adb (Expand_Protected_Subprogram_Call): Add guard to
+ better detect call within an entry_wrapper.
+ * sem_res.adb (Resolve_Call): A protected call within an
+ entity_wrapper is analyzed in the context of the protected
+ object but corresponds to a pre-analysis and is not an access
+ before elaboration.
+ * sem_attr.adb: Minor reformatting.
+
2017-01-06 Justin Squirek <squirek@adacore.com>
* sem_attr.adb (Analyze_Attribute): Modify semantic checks for
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index 2a0dac7..3f201bb 100644
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -6006,6 +6006,7 @@ package body Exp_Ch6 is
-- case this must be handled as an inter-object call.
if not In_Open_Scopes (Scop)
+ or else Is_Entry_Wrapper (Current_Scope)
or else not Is_Entity_Name (Name (N))
then
if Nkind (Name (N)) = N_Selected_Component then
diff --git a/gcc/ada/sem_attr.adb b/gcc/ada/sem_attr.adb
index 8d88338..91d740a 100644
--- a/gcc/ada/sem_attr.adb
+++ b/gcc/ada/sem_attr.adb
@@ -3840,24 +3840,29 @@ package body Sem_Attr is
when Attribute_Finalization_Size =>
Check_E0;
+ -- The prefix denotes an object
+
if Is_Object_Reference (P) then
Analyze_And_Resolve (P);
Check_Object_Reference (P);
- -- Redundant type verification for accurate error output
+ -- Check the prefix is a type to avoid an error message stating the
+ -- prefix must exclusively denote one
+
+ elsif Is_Entity_Name (P) and then Is_Type (Entity (P)) then
- elsif not Is_Entity_Name (P)
- or else not Is_Type (Entity (P))
- then
- Error_Attr_P ("prefix of % attribute must be a definite type or" &
- " an object");
- else
Check_Type;
Check_Not_Incomplete_Type;
if Is_Class_Wide_Type (Etype (P)) then
- Error_Attr_P ("prefix of % attribute cannot be applied to " &
- "a class-wide type");
+ Error_Attr_P
+ ("prefix of % attribute cannot denote a class-wide type");
end if;
+
+ -- The prefix does not denote an object or a type
+
+ else
+ Error_Attr_P
+ ("prefix of % attribute must be a definite type or an object");
end if;
Set_Etype (N, Universal_Integer);
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index f174ad9..74dc0e1 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -6287,12 +6287,14 @@ package body Sem_Res is
-- A protected function cannot be called within the definition of the
-- enclosing protected type, unless it is part of a pre/postcondition
- -- on another protected operation.
+ -- on another protected operation. This may appear in the entry
+ -- wrapper created for an entry with preconditions.
if Is_Protected_Type (Scope (Nam))
and then In_Open_Scopes (Scope (Nam))
and then not Has_Completion (Scope (Nam))
and then not In_Spec_Expression
+ and then not Is_Entry_Wrapper (Current_Scope)
then
Error_Msg_NE
("& cannot be called before end of protected definition", N, Nam);