Ed Schonberg [Wed, 23 May 2018 10:22:35 +0000 (10:22 +0000)]
[Ada] Crash on predicate involving qualified expression in instance
This patch inhibits the generation of freeze nodes when pre-analyzing the
domain of iteration of an Ada2012 loop that appears as a quantified
expression in a predicate for an array type. This prevents a back-end
abort on an invisible freeze node that would otherwise appear in an
unexpanded code sequence.
The following must compile quietly:
----
with Id_Manager;
package My_Id_Manager is new Id_Manager (Max_Id_Type => 100_000,
Max_Key_Count => 100);
----
generic
Max_Id_Type : Positive;
Max_Key_Count : Positive;
package Id_Manager is
type Unique_Id_Type is new Integer range 0 .. Max_Id_Type;
Undefined_Id : constant Unique_Id_Type := 0;
type Key_Count is new Integer range 0 .. Max_Key_Count;
subtype Key_Index is Key_Count range 1 .. Key_Count'Last;
type Key_Array is array (Key_Index range <>) of Unique_Id_Type
with Predicate => Key_Array'First = 1;
type Id_Manager_State (Capacity : Key_Count) is private;
procedure Display_Objects (TheObject : Id_Manager_State);
private
type Id_Manager_State (Capacity : Key_Count) is record
Id_Key : Key_Array (1 .. Capacity) := (others => Undefined_Id);
Key_Size : Key_Count := 0;
end record;
end Id_Manager;
----
package body Id_Manager is
procedure Display_Objects (TheObject : Id_Manager_State) is
begin
for Item of TheObject.Id_Key loop
null;
end loop;
end Display_Objects;
end Id_Manager;
2018-05-23 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch5.adb (Preanalyze_Range): The pre-analysis of the domain of
iteration of an Ada2012 loop is performed to determine the type of the
domain, but full analysis is performed once the loop is rewritten as a
while-loop during expansion. The pre-analysis suppresses expansion; it
must also suppress the generation of freeze nodes, which may otherwise
appear in the wrong scope before rewritting.
From-SVN: r260582
Hristian Kirtchev [Wed, 23 May 2018 10:22:30 +0000 (10:22 +0000)]
[Ada] Suppression of elaboration-related warnings
This patch updates the documentation section on suppressing elaboration
warnings. No change in behavior, no need for a test.
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* sem_elab.adb: Update the section on suppressing elaboration warnings.
From-SVN: r260581
Hristian Kirtchev [Wed, 23 May 2018 10:22:25 +0000 (10:22 +0000)]
[Ada] Suppression of elaboration-related warnings
This patch modifies the effects of pragma Warnings (Off, ...) to suppress
elaboration warnings related to an entity.
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* einfo.adb (Is_Elaboration_Checks_OK_Id): Use predicate
Is_Elaboration_Target.
(Is_Elaboration_Target): New routine.
(Is_Elaboration_Warnings_OK_Id): Use predicate Is_Elaboration_Target.
(Set_Is_Elaboration_Checks_OK_Id): Use predicate Is_Elaboration_Target.
(Set_Is_Elaboration_Warnings_OK_Id): Use predicate
Is_Elaboration_Target.
* einfo.ads: Add new synthesized attribute Is_Elaboration_Target along
with occurrences in nodes.
(Is_Elaboration_Target): New routine.
* sem_prag.adb (Analyze_Pragma): Suppress elaboration warnings when an
elaboration target is subject to pragma Warnings (Off, ...).
gcc/testsuite/
* gnat.dg/elab5.adb, gnat.dg/elab5_pkg.adb, gnat.dg/elab5_pkg.ads: New
testcase.
From-SVN: r260580
Eric Botcazou [Wed, 23 May 2018 10:22:20 +0000 (10:22 +0000)]
[Ada] Remove obsolete stuff from repinfo.adb
2018-05-23 Eric Botcazou <ebotcazou@adacore.com>
gcc/ada/
* repinfo.adb (List_Type_Info): Remove obsolete stuff.
From-SVN: r260579
Hristian Kirtchev [Wed, 23 May 2018 10:22:15 +0000 (10:22 +0000)]
[Ada] Suppression of elaboration-related warnings
This patch changes the behavior of elaboration-related warnings as follows:
* If a scenario or a target has [elaboration] warnings suppressed, then
any further elaboration-related warnings along the paths rooted at the
scenario are also suppressed.
* Elaboration-related warnings related to task activation can now be
suppressed when either the task object, task type, or the activation
call have [elaboration] warnings suppressed.
* Elaboration-related warnings related to calls can now be suppressed when
either the target or the call have [elaboration] warnings suppressed.
* Elaboration-related warnings related to instantiations can now be
suppressed when the instantiation has [elaboration] warnings suppressed.
The patch also cleans up the way the state of the Processing phase is updated
with each new node along a path. It is now preferable to update the state in
routines
Process_Conditional_ABE_Activation_Impl
Process_Conditional_ABE_Call
Process_Conditional_ABE_Instantiation
rather than within their language-specific versions.
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* einfo.adb: Flag304 is now Is_Elaboration_Warnings_OK_Id.
(Is_Elaboration_Warnings_OK_Id): New routine.
(Set_Is_Elaboration_Warnings_OK_Id): New routine.
(Write_Entity_Flags): Output Flag304.
* einfo.ads: Add new attribute Is_Elaboration_Warnings_OK_Id along with
occurrences in entities.
(Is_Elaboration_Warnings_OK_Id): New routine along with pragma Inline.
(Set_Is_Elaboration_Warnings_OK_Id): New routine along with pragma
Inline.
* sem_attr.adb (Analyze_Access_Attribute): Capture the state of
elaboration warnings.
* sem_ch3.adb (Analyze_Object_Declaration): Capture the state of
elaboration warnings.
* sem_ch6.adb (Analyze_Abstract_Subprogram_Declaration): Capture the
state of elaboration warnings.
(Analyze_Subprogram_Body_Helper): Capture the state of elaboration
warnings.
(Analyze_Subprogram_Declaration): Capture the state of elaboration
warnings.
* sem_ch9.adb (Analyze_Entry_Declaration): Capture the state of
elaboration warnings.
(Analyze_Single_Task_Declaration): Capture the state of elaboration
warnings.
(Analyze_Task_Type_Declaration): Capture the state of elaboration
warnings.
* sem_ch12.adb (Analyze_Generic_Package_Declaration): Capture the state
of elaboration warnings.
(Analyze_Generic_Subprogram_Declaration): Capture the state of
elaboration warnings.
* sem_elab.adb: Add a section on suppressing elaboration warnings.
Type Processing_Attributes includes component Suppress_Warnings
intended to suppress any elaboration warnings along a path in the
graph. Update Initial_State to include a value for this component.
Types Target_Attributes and Task_Attriutes include component
Elab_Warnings_OK to indicate whether the target or task has elaboration
warnings enabled. component Elab_Warnings_OK.
(Build_Access_Marker): Propagate attribute
Is_Elaboration_Warnings_OK_Node from the attribute to the generated
call marker.
(Extract_Instantiation_Attributes): Set the value for Elab_Warnings_OK.
(Extract_Target_Attributes): Set the value for Elab_Warnings_OK.
(Extract_Task_Attributes): Set the value for Elab_Warnings_OK.
(Process_Conditional_ABE_Access): Suppress futher elaboration warnings
when already in this mode or when the attribute or target have warnings
suppressed.
(Process_Conditional_ABE_Activation_Impl): Do not emit any diagnostics
if warnings are suppressed.
(Process_Conditional_ABE_Call): Suppress further elaboration warnings
when already in this mode, or the target or call have warnings
suppressed.
(Process_Conditional_ABE_Call_Ada): Do not emit any diagnostics if
warnings are suppressed.
(Process_Conditional_ABE_Call_SPARK): Do not emit any diagnostics if
warnings are suppressed.
(Process_Conditional_ABE_Instantiation): Suppress further elaboration
warnings when already in this mode or when the instantiation has
warnings suppressed.
(Process_Conditional_ABE_Instantiation_Ada): Do not emit any
diagnostics if warnings are suppressed.
(Process_Conditional_ABE_Variable_Assignment_Ada): Use the more
specific Is_Elaboration_Warnings_OK_Id rather than Warnings_Off.
(Process_Conditional_ABE_Variable_Assignment_SPARK): Use the more
specific Is_Elaboration_Warnings_OK_Id rather than Warnings_Off.
(Process_Task_Object): Suppress further elaboration warnings when
already in this mode, or when the object, activation call, or task type
have warnings suppressed. Update the processing state to indicate that
the path goes through a task body.
* sinfo.adb (Is_Elaboration_Warnings_OK_Node): Accept attribute
references.
(Set_Is_Elaboration_Warnings_OK_Node): Accept attribute references.
* sinfo.ads: Attribute Is_Elaboration_Warnings_OK_Node now applies to
attribute references.
gcc/testsuite/
* gnat.dg/elab4.adb, gnat.dg/elab4_pkg.adb, gnat.dg/elab4_pkg.ads: New
testcase.
From-SVN: r260578
Piotr Trojanek [Wed, 23 May 2018 10:22:08 +0000 (10:22 +0000)]
[Ada] Minor reformatting
2018-05-23 Piotr Trojanek <trojanek@adacore.com>
gcc/ada/
* einfo.ads: Minor reformatting.
From-SVN: r260577
Ed Schonberg [Wed, 23 May 2018 10:22:03 +0000 (10:22 +0000)]
[Ada] Compiler fails to reject illegal store of anonymous_access_to_subprogram
GNAT properly rejects an attempt to assign an access_to_subprogram formal
to a local variable, according to accessibiiity rules. This patch forces the
same behavior on the use of such a formal in an object declaration.
Compiling store_anon.adb must yield:
store_anon.adb:7:35: illegal attempt to store anonymous access to subprogram
store_anon.adb:7:35: value has deeper accessibility than any master
(RM 3.10.2 (13))
store_anon.adb:7:35: use named access type for "P" instead of access parameter
----
package Store_Anon is
procedure Store (P : not null access procedure);
procedure Invoke;
end Store_Anon;
----
package body Store_Anon is
type P_Ptr is access procedure;
Stored : P_Ptr;
procedure Store (P : not null access procedure) is
Illegal : constant P_Ptr := P;
begin -- Store
Stored := Illegal;
end Store;
procedure Invoke is
-- Empty
begin -- Invoke
Stored.all;
end Invoke;
end Store_Anon;
2018-05-23 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch3.adb (Analyze_Object_Declaration): If expression is an
anonymous_access_to_ subprogram formal, apply a conversion to force an
accsssibility check that will fail statically, enforcing 3.10.2 (13).
From-SVN: r260576
Daniel Mercier [Wed, 23 May 2018 10:21:58 +0000 (10:21 +0000)]
[Ada] Turn off length expansion in CodePeer mode
2018-05-23 Daniel Mercier <mercier@adacore.com>
gcc/ada/
* gnat1drv.adb: Turn off length expansion in CodePeer mode.
From-SVN: r260575
Bob Duff [Wed, 23 May 2018 10:21:53 +0000 (10:21 +0000)]
[Ada] Build-in-place aggregates and Address clauses
This patch fixes a bug in which if a limited volatile variable with
an Address aspect is initialized with a build-in-place aggregate
containing build-in-place function calls, the compiler can crash.
2018-05-23 Bob Duff <duff@adacore.com>
gcc/ada/
* freeze.adb: (Check_Address_Clause): Deal with build-in-place
aggregates in addition to build-in-place calls.
gcc/testsuite/
* gnat.dg/addr10.adb: New testcase.
From-SVN: r260574
Bob Duff [Wed, 23 May 2018 10:21:47 +0000 (10:21 +0000)]
[Ada] Minor reformatting
2018-05-23 Bob Duff <duff@adacore.com>
gcc/ada/
* einfo.ads: Minor reformatting.
* sem_ch3.adb: Likewise.
* sinfo.ads: Likewise.
From-SVN: r260573
Hristian Kirtchev [Wed, 23 May 2018 10:21:42 +0000 (10:21 +0000)]
[Ada] Initialize_Scalars optimization causes spurious runtime check failure
This patch suppresses the optimization of scalar arrays when pragma
Initialize_Scalars is in effect if the component type is subject to
predicates. Since the scalar array is initialized with invalid values,
these values may violate the predicate or a validity check within the
predicate.
------------
-- Source --
------------
-- gnat.adc
pragma Initialize_Scalars;
-- types.ads
with System; use System;
package Types is
type Byte is mod System.Storage_Unit;
subtype Inter_Byte is Byte;
function Always_OK (B : Inter_Byte) return Boolean is (True);
function Is_OK (B : Inter_Byte) return Boolean is (Always_OK (B));
subtype Final_Byte is Byte with Predicate => Is_OK (Final_Byte);
type Bytes is array (1 .. 5) of Final_Byte;
Obj : Bytes;
end Types;
-- main.adb
with Types; use Types;
procedure Main is begin null; end Main;
-----------------
-- Compilation --
-----------------
$ gnatmake -q -gnata -gnatVa main.adb
$ ./main
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_ch3.adb (Default_Initialize_Object): Do not optimize scalar array
initialization when the component type has predicates.
* exp_ch4.adb (Expand_N_Allocator): Do not optimize scalar array
allocation when the component type has predicates.
From-SVN: r260572
Hristian Kirtchev [Wed, 23 May 2018 10:21:37 +0000 (10:21 +0000)]
[Ada] Minor reformatting
2018-05-23 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* einfo.adb, exp_disp.adb, sem_ch3.adb, sem_ch6.adb, sem_prag.adb:
Minor reformatting.
From-SVN: r260571
Richard Biener [Wed, 23 May 2018 09:06:01 +0000 (09:06 +0000)]
re PR middle-end/85874 (gcc points to wrong location when displaying warning for strict overflow warning)
2018-05-23 Richard Biener <rguenther@suse.de>
PR middle-end/85874
* tree-data-ref.c (create_runtime_alias_checks): Defer
and ignore overflow warnings.
* gcc.dg/Wstrict-overflow-27.c: New testcase.
From-SVN: r260569
Yury Gribov [Wed, 23 May 2018 07:40:43 +0000 (07:40 +0000)]
re PR tree-optimization/85822 (Maybe wrong code in VRP since r249150)
PR tree-optimization/85822
From-SVN: r260566
Richard Biener [Wed, 23 May 2018 07:08:43 +0000 (07:08 +0000)]
tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary memset constants via native_interpret_expr.
2018-05-23 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (vn_reference_lookup_3): Handle arbitrary
memset constants via native_interpret_expr.
* gcc.dg/tree-ssa/ssa-fre-65.c: New testcase.
From-SVN: r260565
Jason Merrill [Wed, 23 May 2018 03:52:56 +0000 (23:52 -0400)]
PR c++/81420 - not extending temporary lifetime.
* call.c (extend_ref_init_temps_1): Handle ARRAY_REF.
* class.c (build_base_path): Avoid redundant move of an rvalue.
From-SVN: r260563
Jason Merrill [Wed, 23 May 2018 03:52:49 +0000 (23:52 -0400)]
PR c++/85866 - error with .* in default template arg.
* pt.c (tsubst_copy_and_build): Handle partial instantiation.
From-SVN: r260562
GCC Administrator [Wed, 23 May 2018 00:16:19 +0000 (00:16 +0000)]
Daily bump.
From-SVN: r260561
Janus Weil [Tue, 22 May 2018 20:05:53 +0000 (22:05 +0200)]
re PR fortran/85841 ([F2018] reject deleted features)
2018-05-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/85841
* gfortran.dg/pr30667.f: Add option "-std=legacy".
From-SVN: r260555
Martin Sebor [Tue, 22 May 2018 19:37:48 +0000 (19:37 +0000)]
PR middle-end/85359 - duplicate -Wstringop-overflow for a strcmp call with a nonstring pointer
gcc/ChangeLog:
PR middle-end/85359
* builtins.c (expand_builtin_strcpy): Call maybe_warn_nonstring_arg
only when expasion succeeds.
(expand_builtin_strcmp): Same.
(expand_builtin_strncmp): Same.
gcc/testsuite/ChangeLog:
PR middle-end/85359
* gcc.dg/attr-nonstring.c: New test.
From-SVN: r260550
H.J. Lu [Tue, 22 May 2018 19:10:34 +0000 (19:10 +0000)]
Don't mark IFUNC resolver as only called directly
Since IFUNC resolver is called indirectly, don't mark IFUNC resolver as
only called directly. This patch adds ifunc_resolver to cgraph_node,
sets ifunc_resolver for ifunc attribute and checks ifunc_resolver
instead of looking up ifunc attribute.
gcc/
PR target/85345
* cgraph.h (cgraph_node::create): Set ifunc_resolver for ifunc
attribute.
(cgraph_node::create_alias): Likewise.
(cgraph_node::get_availability): Check ifunc_resolver instead
of looking up ifunc attribute.
* cgraphunit.c (maybe_diag_incompatible_alias): Likewise.
* varasm.c (do_assemble_alias): Likewise.
(assemble_alias): Likewise.
(default_binds_local_p_3): Likewise.
* cgraph.h (cgraph_node): Add ifunc_resolver.
(cgraph_node::only_called_directly_or_aliased_p): Return false
for IFUNC resolver.
* lto-cgraph.c (input_node): Set ifunc_resolver for ifunc
attribute.
* symtab.c (symtab_node::verify_base): Verify that ifunc_resolver
is equivalent to lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)).
(symtab_node::binds_to_current_def_p): Check ifunc_resolver
instead of looking up ifunc attribute.
gcc/testsuite/
PR target/85345
* gcc.target/i386/pr85345.c: New test.
From-SVN: r260547
Luis Machado [Tue, 22 May 2018 18:35:15 +0000 (18:35 +0000)]
[AArch64] Recognize a missed usage of a sbfiz instruction
A customer reported the following missed opportunities to combine a couple
instructions into a sbfiz.
int sbfiz32 (int x)
{
return x << 29 >> 10;
}
long sbfiz64 (long x)
{
return x << 58 >> 20;
}
This gets converted to the following pattern:
(set (reg:SI 98)
(ashift:SI (sign_extend:SI (reg:HI 0 x0 [ xD.3334 ]))
(const_int 6 [0x6])))
Currently, gcc generates the following:
sbfiz32:
lsl x0, x0, 29
asr x0, x0, 10
ret
sbfiz64:
lsl x0, x0, 58
asr x0, x0, 20
ret
It could generate this instead:
sbfiz32:
sbfiz w0, w0, 19, 3
ret
sbfiz64::
sbfiz x0, x0, 38, 6
ret
The unsigned versions already generate ubfiz for the same code, so the lack of
a sbfiz pattern may have been an oversight.
This particular sbfiz pattern shows up in both CPU2006 (~ 80 hits) and
CPU2017 (~ 280 hits). It's not a lot, but seems beneficial in any case. No
significant performance differences, probably due to the small number of
occurrences or cases outside hot areas.
gcc/ChangeLog:
2018-05-22 Luis Machado <luis.machado@linaro.org>
gcc/
* config/aarch64/aarch64.md (*ashift<mode>_extv_bfiz): New pattern.
gcc/testsuite/ChangeLog:
2018-05-22 Luis Machado <luis.machado@linaro.org>
gcc/testsuite/
* gcc.target/aarch64/lsl_asr_sbfiz.c: New test.
From-SVN: r260546
Janus Weil [Tue, 22 May 2018 18:22:29 +0000 (20:22 +0200)]
re PR fortran/85841 ([F2018] reject deleted features)
2018-05-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/85841
* gfortran.dg/gomp/appendix-a/a.6.1.f90: Replace dg-options by
dg-additional-options.
* gfortran.dg/graphite/block-2.f: Ditto.
* gfortran.dg/graphite/id-19.f: Ditto.
* gfortran.dg/vect/Ofast-pr50414.f90: Ditto.
* gfortran.dg/vect/cost-model-pr34445a.f: Ditto.
* gfortran.dg/vect/pr52580.f: Ditto.
From-SVN: r260544
Martin Sebor [Tue, 22 May 2018 17:51:16 +0000 (17:51 +0000)]
Fix typo in a comment.
From-SVN: r260543
Martin Sebor [Tue, 22 May 2018 17:45:35 +0000 (17:45 +0000)]
PR c/85623 - strncmp() warns about attribute 'nonstring' incorrectly in -Wstringop-overflow
gcc/ChangeLog:
PR c/85623
* calls.c (maybe_warn_nonstring_arg): Use string length to set
or ajust the presumed bound on an operation to avoid unnecessary
warnings.
gcc/testsuite/ChangeLog:
PR c/85623
* c-c++-common/attr-nonstring-3.c: Adjust.
* c-c++-common/attr-nonstring-4.c: Adjust.
* c-c++-common/attr-nonstring-6.c: New test.
From-SVN: r260541
Jackson Woodruff [Tue, 22 May 2018 15:37:11 +0000 (15:37 +0000)]
[AArch64, patch] Refactor of aarch64-ldpstp
This patch removes a lot of duplicated code in aarch64-ldpstp.md.
The patterns that did not previously generate a base register now
do not check for aarch64_mem_pair_operand in the pattern. This has
been extracted to a check in aarch64_operands_ok_for_ldpstp.
All patterns in the file used to have explicit switching code to
swap loads and stores that were in the wrong order.
This has been extracted into aarch64_operands_ok_for_ldpstp
as a final operation after all the checks have been performed.
2018-05-22 Jackson Woodruff <jackson.woodruff@arm.com>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64-ldpstp.md: Replace uses of
aarch64_mem_pair_operand with memory_operand and delete operand swapping
code.
* config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp):
Add check for legitimate_address.
(aarch64_gen_adjusted_ldpstp): Swap operands where appropriate.
(aarch64_swap_ldrstr_operands): New.
* config/aarch64/aarch64-protos.h (aarch64_swap_ldrstr_operands):
Define prototype.
Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
From-SVN: r260539
Jackson Woodruff [Tue, 22 May 2018 15:35:06 +0000 (15:35 +0000)]
[AArch64] Merge stores of D-register values with different modes
This patch merges loads and stores from D-registers that are of different modes.
Code like this:
typedef int __attribute__((vector_size(8))) vec;
struct pair
{
vec v;
double d;
}
Now generates a store pair instruction:
void
assign (struct pair *p, vec v)
{
p->v = v;
p->d = 1.0;
}
Whereas previously it generated two `str` instructions.
This patch also merges storing of double zero values with
long integer values:
struct pair
{
long long l;
double d;
}
void
foo (struct pair *p)
{
p->l = 10;
p->d = 0.0;
}
Now generates a single store pair instruction rather than two `str` instructions.
The patch basically generalises the mode iterators on the patterns in aarch64.md
and the peepholes in aarch64-ldpstp.md to take all combinations of pairs of modes
so, while it may be a large-ish patch, it does fairly mechanical stuff.
2018-05-22 Jackson Woodruff <jackson.woodruff@arm.com>
Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.md: New patterns to generate stp
and ldp.
(store_pair_sw, store_pair_dw): New patterns to generate stp for
single words and double words.
(load_pair_sw, load_pair_dw): Likewise.
(store_pair_sf, store_pair_df, store_pair_si, store_pair_di):
Delete.
(load_pair_sf, load_pair_df, load_pair_si, load_pair_di):
Delete.
* config/aarch64/aarch64-ldpstp.md: Modify peephole
for different mode ldpstp and add peephole for merged zero stores.
Likewise for loads.
* config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp):
Add size check.
(aarch64_gen_store_pair): Rename calls to match new patterns.
(aarch64_gen_load_pair): Rename calls to match new patterns.
* config/aarch64/aarch64-simd.md (load_pair<mode>): Rename to...
(load_pair<DREG:mode><DREG2:mode>): ... This.
(store_pair<mode>): Rename to...
(vec_store_pair<DREG:mode><DREG2:mode>): ... This.
* config/aarch64/iterators.md (DREG, DREG2, DX2, SX, SX2, DSX):
New mode iterators.
(V_INT_EQUIV): Handle SImode.
* config/aarch64/predicates.md (aarch64_reg_zero_or_fp_zero):
New predicate.
* gcc.target/aarch64/ldp_stp_6.c: New.
* gcc.target/aarch64/ldp_stp_7.c: New.
* gcc.target/aarch64/ldp_stp_8.c: New.
Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com>
From-SVN: r260538
Martin Sebor [Tue, 22 May 2018 15:22:16 +0000 (15:22 +0000)]
PR tree-optimization/85826 - ICE in gimple-ssa-warn-restruct on
PR tree-optimization/85826 - ICE in gimple-ssa-warn-restruct on
a variable-length struct
gcc/ChangeLog:
PR tree-optimization/85826
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Avoid
assuming that a DECL necesarily has a constant size.
gcc/testsuite/ChangeLog:
PR tree-optimization/85826
* gcc.dg/Wrestrict-17.c: New test.
From-SVN: r260537
Richard Sandiford [Tue, 22 May 2018 15:11:45 +0000 (15:11 +0000)]
pr85862.c: Rename to...
2018-05-22 Richard Sandiford <richard.sandiford@linaro.org>
gcc/testsuite/
* gcc.dg/torture/pr85862.c: Rename to...
* gcc.dg/torture/pr85852.c: ...this.
From-SVN: r260536
Justin Squirek [Tue, 22 May 2018 13:27:14 +0000 (13:27 +0000)]
[Ada] Missing warning for unreferenced formals in expression functions
This patch fixes an issue whereby the compiler failed to properly warn against
unreferenced formal parameters when analyzing expression functions.
2018-05-22 Justin Squirek <squirek@adacore.com>
gcc/ada/
* sem_ch6.adb (Analyze_Expression_Function): Propagate flags from the
original function spec into the generated function spec due to
expansion of expression functions during analysis.
(Analyze_Subprogram_Body_Helper): Modify check on formal parameter
references from the body to the subprogram spec in the case of
expression functions because of inconsistances related to having a
generated body.
* libgnarl/s-osinte__android.ads: Flag parameters as unused.
* libgnarl/s-osinte__lynxos178e.ads: Likewise.
* libgnarl/s-osinte__qnx.adb: Likewise.
* libgnarl/s-osinte__qnx.ads: Likewise.
gcc/testsuite/
* gnat.dg/warn14.adb: New testcase.
From-SVN: r260535
Doug Rupp [Tue, 22 May 2018 13:27:06 +0000 (13:27 +0000)]
[Ada] Don't define HAVE_ADJUST_CONTEXT_FOR_RAISE on VxWorks7 for AArch64
2018-05-22 Doug Rupp <rupp@adacore.com>
gcc/ada/
* init.c (HAVE_ADJUST_CONTEXT_FOR_RAISE): Don't define on VxWorks7 for
AArch64.
From-SVN: r260534
Olivier Hainque [Tue, 22 May 2018 13:27:01 +0000 (13:27 +0000)]
[Ada] Fix Reraise_Occurrence of Foreign_Exception
In a sequence like
(d) (c) (b) (a)
c++ raises <-- Ada calls c++, <-- c++ call Ada <-- Ada calls
exception others handler and handles c++
gets foreign c++ exception
exception and
re-raises
the original exception raised on the C++ world at (d) couldn't be caught
as a regular c++ exception at (b) when the re-raise performed at (c) is
done with an explicit call to Ada.Exceptions.Reraise_Occurrence.
Indeed, the latter just re-crafted a new Ada-ish occurence and the
nature and contents of the original exception object were lost.
This patch fixes this by refining Reraise_Occurrence to be more careful
with exceptions in the course of a propagation, just resuming propagation
of the original object.
From the set of soures below, compilation and execution with:
g++ -c bd.cc && gnatmake -f -g a.adb -largs bd.o --LINK=g++ && ./a
is expected to output:
foreign exception caught, reraising ...
b() caught x = 5
----
// bd.cc
extern "C" {
extern void c();
void b ();
void d ();
}
void b ()
{
try {
c();
} catch (int x) {
printf ("b() caught x = %d\n", x);
}
}
void d ()
{
throw (5);
}
-- a.adb
with C;
procedure A is
procedure B;
pragma Import (Cpp, B);
begin
B;
end;
-- c.ads
procedure C;
pragma Export (C, C, "c");
-- c.adb
with Ada.Exceptions; use Ada.Exceptions;
with System.Standard_Library;
with Ada.Unchecked_Conversion;
with Ada.Text_IO; use Ada.Text_IO;
procedure C is
package SSL renames System.Standard_Library;
use type SSL.Exception_Data_Ptr;
function To_Exception_Data_Ptr is new
Ada.Unchecked_Conversion (Exception_Id, SSL.Exception_Data_Ptr);
procedure D;
pragma Import (Cpp, D);
Foreign_Exception : aliased SSL.Exception_Data;
pragma Import
(Ada, Foreign_Exception, "system__exceptions__foreign_exception");
begin
D;
exception
when E : others =>
if To_Exception_Data_Ptr (Exception_Identity (E))
= Foreign_Exception'Unchecked_access
then
Put_Line ("foreign exception caught, reraising ...");
Reraise_Occurrence (E);
end if;
end;
2018-05-22 Olivier Hainque <hainque@adacore.com>
gcc/ada/
* libgnat/a-except.adb (Exception_Propagation.Propagate_Exception):
Expect an Exception_Occurence object, not an Access.
(Complete_And_Propagate_Occurrence): Adjust accordingly.
(Raise_From_Signal_Handler): Likewise.
(Reraise_Occurrence_No_Defer): If we have a Machine_Occurrence
available in the provided occurrence object, just re-propagate the
latter as a bare "raise;" would do.
* libgnat/a-exexpr.adb (Propagate_Exception): Adjust to spec change.
* libgnat/a-exstat.adb (String_To_EO): Initialize X.Machine_Occurrence
to null, to mark that the occurrence we're crafting from the stream
contents is not being propagated (yet).
From-SVN: r260533
Hristian Kirtchev [Tue, 22 May 2018 13:26:55 +0000 (13:26 +0000)]
[Ada] Crash on partial initialization of controlled component
This patch modifies the late expansion of record aggregates to ensure that the
generated code which handles a controlled component initialized by a function
call is inserted in line with the rest of the initialization code, rather than
before the record aggregate. This way the function call has proper access to
the discriminants of the object being created.
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_aggr.adb (Initialize_Ctrl_Record_Component): Insert the generated
code for a transient component in line with the rest of the
initialization code, rather than before the aggregate. This ensures
that the component has proper visibility of the discriminants.
gcc/testsuite/
* gnat.dg/controlled8.adb: New testcase.
From-SVN: r260532
Jerome Lambourg [Tue, 22 May 2018 13:26:49 +0000 (13:26 +0000)]
[Ada] Fix retrieval of number of CPUs on QNX
Although the sysconf SC_NPROCESSORS_ONLN is also defined by the API, the
only documented way to retrieve the number of CPUs is by using the syspage.
This also better organise the QNX-specific macros in adaint.c
2018-05-22 Jerome Lambourg <lambourg@adacore.com>
gcc/ada/
* adaint.c: Reorganize QNX-specific macros, use syspage to retreive the
number of CPUs.
From-SVN: r260531
Jerome Lambourg [Tue, 22 May 2018 13:26:33 +0000 (13:26 +0000)]
[Ada] Fix the signal trampoline on QNX
The trampoline now properly restores the link register as well as the stack
pointer. As a minor optimisation, now only callee-saved registers are
restored: the scratch registers don't need that.
2018-05-22 Jerome Lambourg <lambourg@adacore.com>
gcc/ada/
* sigtramp-qnx.c: Properly restore link register in signal trampoline.
From-SVN: r260530
Hristian Kirtchev [Tue, 22 May 2018 13:26:28 +0000 (13:26 +0000)]
[Ada] In-place initialization for Initialize_Scalars
This patch optimizes the initialization and allocation of scalar array objects
when pragma Initialize_Scalars is in effect. The patch also extends the syntax
and semantics of pragma Initialize_Scalars to allow for the specification of
invalid values pertaining to families of scalar types. The new syntax is as
follows:
pragma Initialize_Scalars
[ ( TYPE_VALUE_PAIR {, TYPE_VALUE_PAIR} ) ];
TYPE_VALUE_PAIR ::=
SCALAR_TYPE => static_EXPRESSION
SCALAR_TYPE :=
Short_Float
| Float
| Long_Float
| Long_Long_Flat
| Signed_8
| Signed_16
| Signed_32
| Signed_64
| Unsigned_8
| Unsigned_16
| Unsigned_32
| Unsigned_64
Depending on the value specified by pragma Initialize_Scalars, the backend may
optimize the creation of the scalar array object into a fast memset.
------------
-- Source --
------------
-- gnat.adc
pragma Initialize_Scalars
(Short_Float => 0.0,
Float => 0.0,
Long_Float => 0.0,
Long_Long_Float => 0.0,
Signed_8 => 0,
Signed_16 => 0,
Signed_32 => 0,
Signed_64 => 0,
Unsigned_8 => 0,
Unsigned_16 => 0,
Unsigned_32 => 0,
Unsigned_64 => 0);
-- types.ads
with System;
package Types is
Max : constant := 10_000;
subtype Big is Integer range 1 .. Max;
type Byte is range 0 .. 255;
for Byte'Size use System.Storage_Unit;
type Byte_Arr_1 is array (1 .. Max) of Byte;
type Byte_Arr_2 is array (Big) of Byte;
type Byte_Arr_3 is array (Integer range <>) of Byte;
type Byte_Arr_4 is array (Integer range <>,
Integer range <>) of Byte;
type Constr_Arr_1 is array (1 .. Max) of Integer;
type Constr_Arr_2 is array (Big) of Integer;
type Constr_Arr_3 is array (1 .. Max, 1 .. Max) of Integer;
type Constr_Arr_4 is array (Big, Big) of Integer;
type Unconstr_Arr_1 is array (Integer range <>) of Integer;
type Unconstr_Arr_2 is array (Integer range <>,
Integer range <>) of Integer;
subtype Subt_Arr_1 is Unconstr_Arr_1 (1 .. Max);
subtype Subt_Arr_2 is Unconstr_Arr_1 (Big);
subtype Subt_Arr_3 is Unconstr_Arr_2 (1 .. Max, 1 .. Max);
subtype Subt_Arr_4 is Unconstr_Arr_2 (Big, Big);
subtype Subt_Str_1 is String (1 .. Max);
subtype Subt_Str_2 is String (Big);
type Byte_Arr_1_Ptr is access Byte_Arr_1;
type Byte_Arr_2_Ptr is access Byte_Arr_2;
type Byte_Arr_3_Ptr is access Byte_Arr_3;
type Byte_Arr_4_Ptr is access Byte_Arr_4;
type Constr_Arr_1_Ptr is access Constr_Arr_1;
type Constr_Arr_2_Ptr is access Constr_Arr_2;
type Constr_Arr_3_Ptr is access Constr_Arr_3;
type Constr_Arr_4_Ptr is access Constr_Arr_4;
type Unconstr_Arr_1_Ptr is access Unconstr_Arr_1;
type Unconstr_Arr_2_Ptr is access Unconstr_Arr_2;
type Subt_Arr_1_Ptr is access Subt_Arr_1;
type Subt_Arr_2_Ptr is access Subt_Arr_2;
type Subt_Arr_3_Ptr is access Subt_Arr_3;
type Subt_Arr_4_Ptr is access Subt_Arr_4;
type Str_Ptr is access String;
type Subt_Str_1_Ptr is access Subt_Str_1;
type Subt_Str_2_Ptr is access Subt_Str_2;
end Types;
-- main.adb
with Types; use Types;
procedure Main is
Byte_Arr_1_Obj : Byte_Arr_1;
Byte_Arr_2_Obj : Byte_Arr_2;
Byte_Arr_3_Obj : Byte_Arr_3 (1 .. Max);
Byte_Arr_4_Obj : Byte_Arr_3 (Big);
Byte_Arr_5_Obj : Byte_Arr_4 (1 .. Max, 1 .. Max);
Byte_Arr_6_Obj : Byte_Arr_4 (Big, Big);
Constr_Arr_1_Obj : Constr_Arr_1;
Constr_Arr_2_Obj : Constr_Arr_2;
Constr_Arr_3_Obj : Constr_Arr_3;
Constr_Arr_4_Obj : Constr_Arr_4;
Unconstr_Arr_1_Obj : Unconstr_Arr_1 (1 .. Max);
Unconstr_Arr_2_Obj : Unconstr_Arr_1 (Big);
Unconstr_Arr_3_Obj : Unconstr_Arr_2 (1 .. Max, 1 .. Max);
Unconstr_Arr_4_Obj : Unconstr_Arr_2 (Big, Big);
Subt_Arr_1_Obj : Subt_Arr_1;
Subt_Arr_2_Obj : Subt_Arr_2;
Subt_Arr_3_Obj : Subt_Arr_3;
Subt_Arr_4_Obj : Subt_Arr_4;
Str_1_Obj : String (1 .. Max);
Str_2_Obj : String (Big);
Subt_Str_1_Obj : Subt_Str_1;
Subt_Str_2_Obj : Subt_Str_2;
Byte_Arr_1_Ptr_Obj : Byte_Arr_1_Ptr := new Byte_Arr_1;
Byte_Arr_2_Ptr_Obj : Byte_Arr_2_Ptr := new Byte_Arr_2;
Byte_Arr_3_Ptr_Obj : Byte_Arr_3_Ptr := new Byte_Arr_3 (1 .. Max);
Byte_Arr_4_Ptr_Obj : Byte_Arr_3_Ptr := new Byte_Arr_3 (Big);
Byte_Arr_5_Ptr_Obj : Byte_Arr_4_Ptr :=
new Byte_Arr_4 (1 .. Max, 1 .. Max);
Byte_Arr_6_Ptr_Obj : Byte_Arr_4_Ptr := new Byte_Arr_4 (Big, Big);
Constr_Arr_1_Ptr_Obj : Constr_Arr_1_Ptr := new Constr_Arr_1;
Constr_Arr_2_Ptr_Obj : Constr_Arr_2_Ptr := new Constr_Arr_2;
Constr_Arr_3_Ptr_Obj : Constr_Arr_3_Ptr := new Constr_Arr_3;
Constr_Arr_4_Ptr_Obj : Constr_Arr_4_Ptr := new Constr_Arr_4;
Unconstr_Arr_1_Ptr_Obj : Unconstr_Arr_1_Ptr :=
new Unconstr_Arr_1 (1 .. Max);
Unconstr_Arr_2_Ptr_Obj : Unconstr_Arr_1_Ptr := new Unconstr_Arr_1 (Big);
Unconstr_Arr_3_Ptr_Obj : Unconstr_Arr_2_Ptr :=
new Unconstr_Arr_2 (1 .. Max, 1 .. Max);
Unconstr_Arr_4_Ptr_Obj : Unconstr_Arr_2_Ptr :=
new Unconstr_Arr_2 (Big, Big);
Subt_Arr_1_Ptr_Obj : Subt_Arr_1_Ptr := new Subt_Arr_1;
Subt_Arr_2_Ptr_Obj : Subt_Arr_2_Ptr := new Subt_Arr_2;
Subt_Arr_3_Ptr_Obj : Subt_Arr_3_Ptr := new Subt_Arr_3;
Subt_Arr_4_Ptr_Obj : Subt_Arr_4_Ptr := new Subt_Arr_4;
Str_Ptr_1_Obj : Str_Ptr := new String (1 .. Max);
Str_Ptr_2_Obj : Str_Ptr := new String (Big);
Subt_Str_1_Ptr_Obj : Subt_Str_1_Ptr := new Subt_Str_1;
Subt_Str_2_Ptr_Obj : Subt_Str_2_Ptr := new Subt_Str_2;
begin null; end Main;
----------------------------
-- Compilation and output --
----------------------------
$ gcc -c -S -gnatDG -gnatws main.adb
$ grep -c "others => types__TbyteB!(0));" main.adb.dg
$ grep -c "others => integer!(0));" main.adb.dg
$ grep -c "others => character!(0));" main.adb.dg
$ grep -c "others => types__TbyteB!(0));" main.adb.dg
$ grep -c "memset" main.s
8
12
8
8
44
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_aggr.adb (Aggr_Assignment_OK_For_Backend): Strip away any
conversions before extracting the value of the expression.
* exp_ch3.adb (Default_Initialize_Object): Optimize the default
initialization of an array of scalars.
(Get_Simple_Init_Val): Add processing for array types. Remove the
processing of strings because this case is already handled by the array
case.
(Needs_Simple_Initialization): Moved to Sem_Util.
(Simple_Init_Array_Type): New routine.
(Simple_Init_Initialize_Scalars_Type): Reimplemented to use the new
facilities from Sem_Util.
(Simple_Initialization_OK): New routine.
* exp_ch3.ads (Needs_Simple_Initialization): Moved to Sem_Util.
* exp_ch4.adb (Expand_N_Allocator): Optimize the default allocation of
an array of scalars.
* sem_prag.adb (Analyze_Float_Value): New routine.
(Analyze_Integer_Value): New routine.
(Analyze_Pragma): Reimplement the analysis of pragma Initialize_Scalars
to handled the extended form of the pragma.
(Analyze_Type_Value_Pair): New routine.
* sem_util.adb: Add invalid value-related data structures.
(Examine_Array_Bounds): New routine.
(Has_Static_Array_Bounds): Reimplemented.
(Has_Static_Non_Empty_Array_Bounds): New routine.
(Invalid_Scalar_Value): New routine.
(Needs_Simple_Initialization): Moved from Exp_Ch3.
(Set_Invalid_Scalar_Value): New routines.
* sem_util.ads (Has_Static_Non_Empty_Array_Bounds): New routine.
(Invalid_Scalar_Value): New routine.
(Needs_Simple_Initialization): Moved from Exp_Ch3.
(Set_Invalid_Scalar_Value): New routines.
* snames.ads-tmpl: Add names for the salar type families used by pragma
Initialize_Scalars.
From-SVN: r260529
Javier Miranda [Tue, 22 May 2018 13:26:23 +0000 (13:26 +0000)]
[Ada] Disable name generation for External_Tag and Expanded_Name
In order to avoid exposing internal names of tagged types in the
binary code generated by the compiler this enhancement facilitates
initializes the External_Tag of a tagged type with an empty string
when pragma No_Tagged_Streams is applicable to the tagged type, and
facilitates initializes its Expanded_Name with an empty string when
pragma Discard_Names is applicable to the tagged type.
This enhancement can be verified by means of the following small
test:
package Library_Level_Test is
type Typ_01 is tagged null record; -- Case 1: No pragmas
type Typ_02 is tagged null record; -- Case 2: Discard_Names
pragma Discard_Names (Typ_02);
pragma No_Tagged_Streams;
type Typ_03 is tagged null record; -- Case 3: No_Tagged_Streams
type Typ_04 is tagged null record; -- Case 4: Both pragmas
pragma Discard_Names (Typ_04);
end;
Commands:
gcc -c -gnatD library_level_test.ads
grep "\.TYP_" library_level_test.ads.dg
Output:
"LIBRARY_LEVEL_TEST.TYP_01["00"]";
"LIBRARY_LEVEL_TEST.TYP_02["00"]";
"LIBRARY_LEVEL_TEST.TYP_03["00"]";
2018-05-22 Javier Miranda <miranda@adacore.com>
gcc/ada/
* exp_disp.adb (Make_DT): Initialize the External_Tag with an empty
string when pragma No_Tagged_Streams is applicable to the tagged type,
and initialize the Expanded_Name with an empty string when pragma
Discard_Names is applicable to the tagged type.
From-SVN: r260528
Ed Schonberg [Tue, 22 May 2018 13:26:17 +0000 (13:26 +0000)]
[Ada] Better error message on illegal 'Access on formal subprogram
This patch improves on the error message for an attempt to apply 'Access
to a formal subprogram. It also applies the check to a renaming of a formal
subprogram.
Compiling p.adb must yield:
p.adb:15:18: not subtype conformant with declaration at line 2
p.adb:15:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))
p.adb:16:18: not subtype conformant with declaration at line 2
p.adb:16:18: formal subprograms are not subtype conformant (RM 6.3.1 (17/3))
----
package body P is
procedure Non_Generic (P : access procedure (I : Integer)) is
begin
P.all (5);
end Non_Generic;
procedure G is
procedure Local (I : Integer) is
begin
Action (I);
end;
procedure Local_Action (I : Integer) renames Action;
begin
Non_Generic (Local'access);
Non_Generic (Local_Action'access);
Non_Generic (Action'access);
-- p.adb:15:18: not subtype conformant with declaration at line 2
-- p.adb:15:18: formal subprograms not allowed
end G;
end P;
----
package P is
generic
with procedure Action (I : Integer);
procedure G;
end P;
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch6.adb (Check_Conformance): Add RM reference for rule that a
formal subprogram is never subtype conformqnt, and thus cannot be the
prefix of 'Access. Reject as well the attribute when applied to a
renaming of a formal subprogram.
From-SVN: r260527
Hristian Kirtchev [Tue, 22 May 2018 13:26:11 +0000 (13:26 +0000)]
[Ada] In-place initialization for Initialize_Scalars
This patch cleans up the implementation of routine Get_Simple_Init_Val. It also
eliminates potentially large and unnecessary tree replications in the context
of object default initialization.
No change in behavior, no test needed.
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_ch3.adb (Build_Array_Init_Proc): Update the call to
Needs_Simple_Initialization.
(Build_Init_Statements): Update the call to Get_Simple_Init_Val.
(Check_Subtype_Bounds): Renamed to Extract_Subtype_Bounds. Update the
profile and comment on usage.
(Default_Initialize_Object): Do not use New_Copy_Tree to set the proper
Sloc of a value obtained from aspect Default_Value because this could
potentially replicate large trees. The proper Sloc is now set in
Get_Simple_Init_Val.
(Get_Simple_Init_Val): Reorganized by breaking the various cases into
separate routines. Eliminate the use of global variables.
(Init_Component): Update the call to Get_Simple_Init_Val.
(Needs_Simple_Initialization): Update the parameter profile and all
uses of T.
(Simple_Init_Defaulted_Type): Copy the value of aspect Default_Value
and set the proper Sloc.
* exp_ch3.ads (Get_Simple_Init_Val): Update the parameter profile and
comment on usage.
(Needs_Simple_Initialization): Update the parameter profile.
From-SVN: r260526
Patrick Bernardi [Tue, 22 May 2018 13:26:05 +0000 (13:26 +0000)]
[Ada] Fix compiler abort on invalid discriminant constraint
This patch fixes a compiler abort on a discriminant constraint when the
constraint is a subtype indication.
2018-05-22 Patrick Bernardi <bernardi@adacore.com>
gcc/ada/
* sem_ch3.adb (Build_Discriminant_Constraints): Raise an error if the
user tries to use a subtype indication as a discriminant constraint.
gcc/testsuite/
* gnat.dg/discr50.adb: New testcase.
From-SVN: r260525
Ed Schonberg [Tue, 22 May 2018 13:25:22 +0000 (13:25 +0000)]
[Ada] Ada2020: Reduction expressions
This patch dismantles the prototype implementation of the first proposal
for Reduction expressions, one of the important potentially parallel
constructs for Ada2020. The ARG is going in a different direction with
a simpler syntax.
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* exp_ch4.ads, exp_ch4.adb, exp_util.adb, expander.adb: Remove mention
of N_Reduction_Expression and N_Reduction_Expression_Parameter.
* par-ch4.adb: Remove parsing routines for reduction expressions.
* sem.adb, sinfo.ads, sinfo.adb, sem_ch4.ads, sem_ch4.adb, sem_res.adb,
sem_spark.adb, sprint.adb: Remove analysis routines for reduction
expressions.
From-SVN: r260524
Arnaud Charlet [Tue, 22 May 2018 13:24:19 +0000 (13:24 +0000)]
[Ada] Do not emit error in Relaxed_RM_Semantics mode
2018-05-22 Arnaud Charlet <charlet@adacore.com>
gcc/ada/
* sem_ch8.adb (Check_Frozen_Renaming): Do not emit error in
Relaxed_RM_Semantics mode.
From-SVN: r260523
Arnaud Charlet [Tue, 22 May 2018 13:23:56 +0000 (13:23 +0000)]
[Ada] Take into account N_Generic_Package_Renaming_Declaration
2018-05-22 Arnaud Charlet <charlet@adacore.com>
gcc/ada/
* comperr.adb (Delete_SCIL_Files): Take into account
N_Generic_Package_Renaming_Declaration.
From-SVN: r260522
Ed Schonberg [Tue, 22 May 2018 13:23:51 +0000 (13:23 +0000)]
[Ada] Crash with private types and renamed discriminants
This patch fixes a compiler abort on an object declaration whose type
is a private type with discriminants, and whose full view is a derived
type that renames some discriminant of its parent.
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch3.adb (Search_Derivation_Levels): Whenever a parent type is
private, use the full view if available, because it may include renamed
discriminants whose values are stored in the corresponding
Stored_Constraint.
gcc/testsuite/
* gnat.dg/discr49.adb, gnat.dg/discr49_rec1.adb,
gnat.dg/discr49_rec1.ads, gnat.dg/discr49_rec2.adb,
gnat.dg/discr49_rec2.ads: New testcase.
From-SVN: r260521
Ed Schonberg [Tue, 22 May 2018 13:23:46 +0000 (13:23 +0000)]
[Ada] Spurious visibility error in a nested instance with formal package
This patch fixes a spurious visibility error with a nested instance of a
generic unit with a formal package, when the actual for it is a formal
package PA of an enclosing generic, and there are subsequent uses of the
formals of PA in that generic unit.
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* einfo.ads, einfo.adb: New attribute Hidden_In_Formal_Instance,
defined on packages that are actuals for formal packages, in order to
set/reset the visibility of the formals of a formal package with given
actuals, when there are subsequent uses of those formals in the
enclosing generic, as required by RN 12.7 (10).
* atree.ads, atree.adb: Add operations for Elist30.
* atree.h: Add Elist30.
* sem_ch12.adb (Analyze_Formal_Package_Instantiation): Collect formals
that are not defaulted and are thus not visible within the current
instance.
(Check_Formal_Packages): Reset visibility of formals of a formal
package that are not defaulted, on exit from current instance.
gcc/testsuite/
* gnat.dg/gen_formal_pkg.adb, gnat.dg/gen_formal_pkg_a.ads,
gnat.dg/gen_formal_pkg_b.ads, gnat.dg/gen_formal_pkg_w.ads: New
testcase.
From-SVN: r260520
Hristian Kirtchev [Tue, 22 May 2018 13:23:40 +0000 (13:23 +0000)]
[Ada] Prohibit output dependency items on functions
This patch modifies the analysis of pragma [Refined_]Depends to emit an error
when the pragma is asspciated with a [generic] function, and one of its clauses
contains a non-null, non-'Result output item.
------------
-- Source --
------------
-- pack.ads
package Pack with SPARK_Mode is
Obj_1 : Integer := 1;
Obj_2 : Integer := 2;
function Func_1 return Integer
with Global => (In_Out => Obj_1); -- Error
function Func_2 return Integer
with Global => (Output => Obj_1); -- Error
function Func_3 return Integer
with Depends => (Func_3'Result => Obj_1, -- OK
Obj_1 => Obj_1); -- Error
function Func_4 return Integer
with Depends => (Func_4'Result => Obj_1, -- OK
null => Obj_2); -- OK
end Pack;
----------------------------
-- Compilation and output --
----------------------------
$ gcc -c pack.ads
pack.ads:6:22: global mode "In_Out" is not applicable to functions
pack.ads:9:22: global mode "Output" is not applicable to functions
pack.ads:13:23: output item is not applicable to function
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* sem_prag.adb (Analyze_Input_Output): Emit an error when a non-null,
non-'Result output appears in the output list of a function.
From-SVN: r260519
Hristian Kirtchev [Tue, 22 May 2018 13:23:35 +0000 (13:23 +0000)]
[Ada] Allow attribute 'Valid_Scalars on private types
This patch modifies the analysis and expansion of attribute 'Valid_Scalars. It
is now possible to specify the attribute on a prefix of an untagged private
type.
------------
-- Source --
------------
-- gnat.adc
pragma Initialize_Scalars;
-- pack1.ads
package Pack1 is
type Acc_1 is private;
type Acc_2 is private;
type Arr_1 is private;
type Arr_2 is private;
type Bool_1 is private;
type Cmpx_1 is private;
type Cmpx_2 is private;
type Enum_1 is private;
type Enum_2 is private;
type Fix_1 is private;
type Fix_2 is private;
type Flt_1 is private;
type Flt_2 is private;
type Modl_1 is private;
type Prot_1 is limited private;
type Prot_2 is limited private;
type Prot_3 (Discr : Boolean) is limited private;
type Rec_1 is private;
type Rec_2 is private;
type Rec_3 is private;
type Rec_4 (Discr : Boolean) is private;
type Rec_5 (Discr_1 : Boolean; Discr_2 : Boolean) is private;
type Sign_1 is private;
type Tag_1 is tagged private;
type Task_1 is limited private;
type Task_2 (Discr : Boolean) is limited private;
type Prec_Arr_1 is private;
type Prec_Arr_2 is private;
type Prec_Arr_3 is private;
type Prec_Arr_4 is private;
type Prec_Arr_5 is private;
type Prec_Rec_1 is private;
type Prec_Rec_2 (Discr : Boolean) is private;
type Prec_Rec_3 (Discr_1 : Boolean; Discr_2 : Boolean) is private;
type Prec_Rec_4 is private;
type Prec_Rec_5 is private;
type Prec_Rec_6 is private;
type Prec_Rec_7 is private;
type Prec_Rec_8 is private;
type Prec_Rec_9 is private;
private
type Acc_1 is access Boolean;
type Acc_2 is access procedure;
type Arr_1 is array (1 .. 10) of Boolean;
type Arr_2 is array (1 .. 3) of access Boolean;
type Bool_1 is new Boolean;
type Cmpx_1 is array (1 .. 5) of Rec_5 (True, True);
type Cmpx_2 is record
Comp_1 : Cmpx_1;
Comp_2 : Rec_4 (True);
end record;
type Enum_1 is (One, Two, Three);
type Enum_2 is ('f', 'o', 'u', 'r');
type Fix_1 is delta 0.5 range 0.0 .. 10.0;
type Fix_2 is delta 0.1 digits 15;
type Flt_1 is digits 8;
type Flt_2 is digits 10 range -1.0 .. 1.0;
type Modl_1 is mod 8;
protected type Prot_1 is
end Prot_1;
protected type Prot_2 is
private
Comp_1 : Boolean;
Comp_2 : Boolean;
end Prot_2;
protected type Prot_3 (Discr : Boolean) is
private
Comp_1 : Boolean;
Comp_2 : Rec_4 (Discr);
end Prot_3;
type Rec_1 is null record;
type Rec_2 is record
null;
end record;
type Rec_3 is record
Comp_1 : Boolean;
Comp_2 : Boolean;
end record;
type Rec_4 (Discr : Boolean) is record
case Discr is
when True =>
Comp_1 : Boolean;
Comp_2 : Boolean;
when False =>
Comp_3 : access Boolean;
end case;
end record;
type Rec_5 (Discr_1 : Boolean; Discr_2 : Boolean) is record
Comp_1 : Boolean;
Comp_2 : Boolean;
case Discr_1 is
when True =>
case Discr_2 is
when True =>
Comp_3 : Boolean;
Comp_4 : Boolean;
when False =>
null;
end case;
when False =>
null;
end case;
end record;
type Sign_1 is range 1 .. 10;
type Tag_1 is tagged null record;
task type Task_1;
task type Task_2 (Discr : Boolean);
type Prec_Arr_1 is array (1 .. 2) of Boolean;
type Prec_Arr_2 is array (1 .. 2, 1 .. 2) of Boolean;
type Prec_Arr_3 is array (1 .. 2) of Prec_Rec_1;
type Prec_Arr_4 is array (1 .. 2) of Prec_Rec_2 (True);
type Prec_Arr_5 is array (1 .. 2) of Prec_Rec_3 (True, True);
type Prec_Rec_1 is record
Comp_1 : Boolean;
end record;
type Prec_Rec_2 (Discr : Boolean) is record
case Discr is
when True =>
Comp_1 : Boolean;
when others =>
Comp_2 : Boolean;
end case;
end record;
type Prec_Rec_3 (Discr_1 : Boolean; Discr_2 : Boolean) is record
case Discr_1 is
when True =>
case Discr_2 is
when True =>
Comp_1 : Boolean;
when others =>
Comp_2 : Boolean;
end case;
when False =>
case Discr_2 is
when True =>
Comp_3 : Boolean;
when others =>
Comp_4 : Boolean;
end case;
end case;
end record;
type Prec_Rec_4 is record
Comp : Prec_Arr_1;
end record;
type Prec_Rec_5 is record
Comp : Prec_Arr_4;
end record;
type Prec_Rec_6 is record
Comp : Prec_Arr_5;
end record;
type Prec_Rec_7 is record
Comp : Prec_Rec_4;
end record;
type Prec_Rec_8 is record
Comp : Prec_Rec_5;
end record;
type Prec_Rec_9 is record
Comp : Prec_Rec_6;
end record;
end Pack1;
-- pack1.adb
package body Pack1 is
protected body Prot_1 is end Prot_1;
protected body Prot_2 is end Prot_2;
protected body Prot_3 is end Prot_3;
task body Task_1 is begin null; end Task_1;
task body Task_2 is begin null; end Task_2;
end Pack1;
-- pack2.ads
with Pack1; use Pack1;
package Pack2 is
type Acc_3 is private;
type Acc_4 is private;
type Arr_3 is private;
type Arr_4 is private;
type Bool_2 is private;
type Cmpx_3 is private;
type Cmpx_4 is private;
type Enum_3 is private;
type Enum_4 is private;
type Fix_3 is private;
type Fix_4 is private;
type Flt_3 is private;
type Flt_4 is private;
type Modl_2 is private;
type Prot_4 is limited private;
type Prot_5 is limited private;
type Prot_6 is limited private;
type Rec_6 is private;
type Rec_7 is private;
type Rec_8 is private;
type Rec_9 (Discr : Boolean) is private;
type Rec_10 (Discr : Boolean) is private;
type Sign_2 is private;
type Task_3 is limited private;
private
type Acc_3 is new Acc_1;
type Acc_4 is new Acc_2;
type Arr_3 is new Arr_1;
type Arr_4 is new Arr_2;
type Bool_2 is new Bool_1;
type Cmpx_3 is new Cmpx_1;
type Cmpx_4 is new Cmpx_2;
type Enum_3 is new Enum_1;
type Enum_4 is new Enum_2;
type Fix_3 is new Fix_1;
type Fix_4 is new Fix_2;
type Flt_3 is new Flt_1;
type Flt_4 is new Flt_2;
type Modl_2 is new Modl_1;
type Prot_4 is new Prot_1;
type Prot_5 is new Prot_2;
type Prot_6 is new Prot_3 (True);
type Rec_6 is new Rec_1;
type Rec_7 is new Rec_2;
type Rec_8 is new Rec_3;
type Rec_9 (Discr : Boolean) is
new Rec_4 (Discr => Discr);
type Rec_10 (Discr : Boolean) is
new Rec_5 (Discr_1 => Discr, Discr_2 => True);
type Sign_2 is new Sign_1;
type Task_3 is new Task_1;
end Pack2;
-- main.adb
with Ada.Text_IO; use Ada.Text_IO;
with Pack1; use Pack1;
with Pack2; use Pack2;
procedure Main is
procedure Check
(Actual : Boolean;
Valid : Boolean;
Test : String)
is
begin
if Actual /= Valid then
Put_Line ("ERROR " & Test);
Put_Line (" valid : " & Valid'Img);
Put_Line (" actual: " & Actual'Img);
end if;
end Check;
Valid : constant Boolean := True;
Not_Valid : constant Boolean := not Valid;
pragma Warnings (Off);
Acc_1_Obj : Acc_1;
Acc_2_Obj : Acc_2;
Acc_3_Obj : Acc_3;
Acc_4_Obj : Acc_4;
Arr_1_Obj : Arr_1;
Arr_2_Obj : Arr_2;
Arr_3_Obj : Arr_3;
Arr_4_Obj : Arr_4;
Bool_1_Obj : Bool_1;
Bool_2_Obj : Bool_2;
Cmpx_1_Obj : Cmpx_1;
Cmpx_2_Obj : Cmpx_2;
Cmpx_3_Obj : Cmpx_3;
Cmpx_4_Obj : Cmpx_4;
Enum_1_Obj : Enum_1;
Enum_2_Obj : Enum_2;
Enum_3_Obj : Enum_3;
Enum_4_Obj : Enum_4;
Fix_1_Obj : Fix_1;
Fix_2_Obj : Fix_2;
Fix_3_Obj : Fix_3;
Fix_4_Obj : Fix_4;
Flt_1_Obj : Flt_1;
Flt_2_Obj : Flt_2;
Flt_3_Obj : Flt_3;
Flt_4_Obj : Flt_4;
Modl_1_Obj : Modl_1;
Modl_2_Obj : Modl_2;
Prot_1_Obj : Prot_1;
Prot_2_Obj : Prot_2;
Prot_3_Obj : Prot_3 (True);
Prot_4_Obj : Prot_4;
Prot_5_Obj : Prot_5;
Rec_1_Obj : Rec_1;
Rec_2_Obj : Rec_2;
Rec_3_Obj : Rec_3;
Rec_4_Obj : Rec_4 (True);
Rec_5_Obj : Rec_5 (True, True);
Rec_6_Obj : Rec_6;
Rec_7_Obj : Rec_7;
Rec_8_Obj : Rec_8;
Rec_9_Obj : Rec_9 (True);
Sign_1_Obj : Sign_1;
Sign_2_Obj : Sign_2;
Tag_1_Obj : Tag_1;
Task_1_Obj : Task_1;
Task_2_Obj : Task_2 (True);
Task_3_Obj : Task_3;
Prec_Arr_1_Obj : Prec_Arr_1;
Prec_Arr_2_Obj : Prec_Arr_2;
Prec_Arr_3_Obj : Prec_Arr_3;
Prec_Arr_4_Obj : Prec_Arr_4;
Prec_Arr_5_Obj : Prec_Arr_5;
Prec_Rec_1_Obj : Prec_Rec_1;
Prec_Rec_2_Obj : Prec_Rec_2 (True);
Prec_Rec_3_Obj : Prec_Rec_3 (True, True);
Prec_Rec_4_Obj : Prec_Rec_4;
Prec_Rec_5_Obj : Prec_Rec_5;
Prec_Rec_6_Obj : Prec_Rec_6;
Prec_Rec_7_Obj : Prec_Rec_7;
Prec_Rec_8_Obj : Prec_Rec_8;
Prec_Rec_9_Obj : Prec_Rec_9;
pragma Warnings (On);
begin
Check (Acc_1_Obj'Valid_Scalars, Valid, "Acc_1_Obj");
Check (Acc_2_Obj'Valid_Scalars, Valid, "Acc_2_Obj");
Check (Acc_3_Obj'Valid_Scalars, Valid, "Acc_3_Obj");
Check (Acc_4_Obj'Valid_Scalars, Valid, "Acc_4_Obj");
Check (Arr_1_Obj'Valid_Scalars, Not_Valid, "Arr_1_Obj");
Check (Arr_2_Obj'Valid_Scalars, Valid, "Arr_2_Obj");
Check (Arr_3_Obj'Valid_Scalars, Not_Valid, "Arr_3_Obj");
Check (Arr_4_Obj'Valid_Scalars, Valid, "Arr_4_Obj");
Check (Bool_1_Obj'Valid_Scalars, Not_Valid, "Bool_1_Obj");
Check (Bool_2_Obj'Valid_Scalars, Not_Valid, "Bool_2_Obj");
Check (Cmpx_1_Obj'Valid_Scalars, Not_Valid, "Cmpx_1_Obj");
Check (Cmpx_2_Obj'Valid_Scalars, Not_Valid, "Cmpx_2_Obj");
Check (Cmpx_3_Obj'Valid_Scalars, Not_Valid, "Cmpx_3_Obj");
Check (Cmpx_4_Obj'Valid_Scalars, Not_Valid, "Cmpx_4_Obj");
Check (Enum_1_Obj'Valid_Scalars, Not_Valid, "Enum_1_Obj");
Check (Enum_2_Obj'Valid_Scalars, Not_Valid, "Enum_2_Obj");
Check (Enum_3_Obj'Valid_Scalars, Not_Valid, "Enum_3_Obj");
Check (Enum_4_Obj'Valid_Scalars, Not_Valid, "Enum_4_Obj");
Check (Fix_1_Obj'Valid_Scalars, Not_Valid, "Fix_1_Obj");
Check (Fix_2_Obj'Valid_Scalars, Not_Valid, "Fix_2_Obj");
Check (Fix_3_Obj'Valid_Scalars, Not_Valid, "Fix_3_Obj");
Check (Fix_4_Obj'Valid_Scalars, Not_Valid, "Fix_4_Obj");
Check (Flt_1_Obj'Valid_Scalars, Not_Valid, "Flt_1_Obj");
Check (Flt_2_Obj'Valid_Scalars, Not_Valid, "Flt_2_Obj");
Check (Flt_3_Obj'Valid_Scalars, Not_Valid, "Flt_3_Obj");
Check (Flt_4_Obj'Valid_Scalars, Not_Valid, "Flt_4_Obj");
Check (Modl_1_Obj'Valid_Scalars, Not_Valid, "Modl_1_Obj");
Check (Modl_2_Obj'Valid_Scalars, Not_Valid, "Modl_2_Obj");
Check (Prot_1_Obj'Valid_Scalars, Valid, "Prot_1_Obj");
Check (Prot_2_Obj'Valid_Scalars, Not_Valid, "Prot_2_Obj");
Check (Prot_3_Obj'Valid_Scalars, Not_Valid, "Prot_3_Obj");
Check (Prot_4_Obj'Valid_Scalars, Valid, "Prot_4_Obj");
Check (Prot_5_Obj'Valid_Scalars, Not_Valid, "Prot_5_Obj");
Check (Rec_1_Obj'Valid_Scalars, Valid, "Rec_1_Obj");
Check (Rec_2_Obj'Valid_Scalars, Valid, "Rec_2_Obj");
Check (Rec_3_Obj'Valid_Scalars, Not_Valid, "Rec_3_Obj");
Check (Rec_4_Obj'Valid_Scalars, Not_Valid, "Rec_4_Obj");
Check (Rec_5_Obj'Valid_Scalars, Not_Valid, "Rec_5_Obj");
Check (Rec_6_Obj'Valid_Scalars, Valid, "Rec_6_Obj");
Check (Rec_7_Obj'Valid_Scalars, Valid, "Rec_7_Obj");
Check (Rec_8_Obj'Valid_Scalars, Not_Valid, "Rec_8_Obj");
Check (Rec_9_Obj'Valid_Scalars, Not_Valid, "Rec_9_Obj");
Check (Sign_1_Obj'Valid_Scalars, Not_Valid, "Sign_1_Obj");
Check (Sign_2_Obj'Valid_Scalars, Not_Valid, "Sign_2_Obj");
Check (Tag_1_Obj'Valid_Scalars, Valid, "Tag_1_Obj");
Check (Task_1_Obj'Valid_Scalars, Valid, "Task_1_Obj");
Check (Task_2_Obj'Valid_Scalars, Valid, "Task_2_Obj");
Check (Task_3_Obj'Valid_Scalars, Valid, "Task_3_Obj");
Check (Prec_Arr_1_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_1_Obj");
Check (Prec_Arr_2_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_2_Obj");
Check (Prec_Arr_3_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_3_Obj");
Check (Prec_Arr_4_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_4_Obj");
Check (Prec_Arr_5_Obj'Valid_Scalars, Not_Valid, "Prec_Arr_5_Obj");
Check (Prec_Rec_1_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_1_Obj");
Check (Prec_Rec_2_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_2_Obj");
Check (Prec_Rec_3_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_3_Obj");
Check (Prec_Rec_4_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_4_Obj");
Check (Prec_Rec_5_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_5_Obj");
Check (Prec_Rec_6_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_6_Obj");
Check (Prec_Rec_7_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_7_Obj");
Check (Prec_Rec_8_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_8_Obj");
Check (Prec_Rec_9_Obj'Valid_Scalars, Not_Valid, "Prec_Rec_9_Obj");
end Main;
-----------------
-- Compilation --
-----------------
$ gnatmake -q main.adb
$ ./main
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_attr.adb (Build_Array_VS_Func): Reimplemented.
(Build_Record_VS_Func): Reimplemented.
(Expand_N_Attribute): Reimplement the handling of attribute
'Valid_Scalars.
* sem_attr.adb (Analyze_Attribute): Reimplement the handling of
attribute 'Valid_Scalars.
* sem_util.adb (Scalar_Part_Present): Reimplemented.
(Validated_View): New routine.
* sem_util.ads (Scalar_Part_Present): Update the parameter profile and
comment on usage.
(Validated_View): New routine.
* doc/gnat_rm/implementation_defined_attributes.rst: Update the
documentation of attribute 'Valid_Scalars.
* gnat_rm.texi: Regenerate.
From-SVN: r260518
Bob Duff [Tue, 22 May 2018 13:23:12 +0000 (13:23 +0000)]
[Ada] Ignore pragma Elaborate_Body in spec of a SAL_Interface package
2018-05-22 Bob Duff <duff@adacore.com>
gcc/ada/
* binde.adb: (Choose): Ignore a pragma Elaborate_Body that appears in
the spec of a SAL_Interface package.
From-SVN: r260517
Ed Schonberg [Tue, 22 May 2018 13:22:58 +0000 (13:22 +0000)]
[Ada] Spurious visibility error on aspect in generic unit
This patch fixes a spurious visiblity error on an instantiation of a generic
package that contains a type declaration with an aspect specification for
an aspect that must be delayed (i.e. an aspect whose value may be specified
at a later point).
The package g.ads must compile quietly:
----
with S;
generic
package G
is
type Buffer_Type is record
Data : Integer;
end record;
package Buffer is new S (Buffer_Type => Buffer_Type);
end G;
----
generic
type Buffer_Type is private;
package S
is
Page_Size : constant := 4096;
type Reader_Type is limited record
Data : Buffer_Type;
end record
with
Alignment => Page_Size; -- Using a constant does not work
-- Alignment => 4096; -- Using a number works
-- for Reader_Type'Alignment use Page_Size; -- so does an attribute.
pragma Compile_Time_Error (Reader_Type'Size /= 12345, "Ooops");
-- Note: We set 'Alignment and check for 'Size.
end S;
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* freeze.adb (Freeze_Entity): When analyzing delayed aspects of an
entity E within a generic unit, indicate that there are no remaining
delayed aspects after invoking Analyze_Aspects_At_Freeze_Point. The
entity E is not frozen yet but the aspects should not be reanalyzed at
the freeze point, which may be outside of the generic and may not have
the proper visibility.
From-SVN: r260516
Bob Duff [Tue, 22 May 2018 13:22:44 +0000 (13:22 +0000)]
[Ada] Document new switches for gnatpp
2018-05-22 Bob Duff <duff@adacore.com>
gcc/ada/
* doc/gnat_ugn/gnat_utility_programs.rst: Add documentation for
the new --split-line-before-record, --indent-named-statements and
--no-align-modes gnatpp switches.
From-SVN: r260515
Ed Schonberg [Tue, 22 May 2018 13:22:06 +0000 (13:22 +0000)]
[Ada] Crash on pragma Compile_Time_Warning with declared string constant
This patch fixes a compiler abort on a pragma Compile_Time_Warning when its
second argument is a reference to a constsant string (rather than a string
literal or an expression that evaluates to a string literal).
Compiling msain.adb must yield:
main.adb:5:33: warning: Good
main.adb:6:33: warning: VALLUE
main.adb:7:33: warning: Test
----
procedure Main is
Value : constant String := "Test";
Switch : constant Boolean := True;
begin
pragma Compile_Time_Warning (Switch, "Good");
pragma Compile_Time_Warning (Switch, "VAL" & "LUE");
pragma Compile_Time_Warning (Switch, value);
null;
end Main;
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_prag.adb (Process_Compile_Time_Warning_Or_Error): Handle properly
a second argument that is a constant of a given string value.
From-SVN: r260514
Doug Rupp [Tue, 22 May 2018 13:21:37 +0000 (13:21 +0000)]
[Ada] Align stack to 128bits on VxWorks for AArch64
Real board requires fat alignment of stack.
2018-05-22 Doug Rupp <rupp@adacore.com>
gcc/ada/
* sigtramp-vxworks-target.inc: Align stack to 128bits on AArch64.
From-SVN: r260513
Jerome Lambourg [Tue, 22 May 2018 13:21:05 +0000 (13:21 +0000)]
[Ada] Fix stack alignment issue in the signal trampoline on QNX
The stack on AArch64 is 128-bit aligned to allow Neon and FPU operations.
2018-05-22 Jerome Lambourg <lambourg@adacore.com>
gcc/ada/
* sigtramp-qnx.c: Fix stack alignment issue in the signal trampoline.
From-SVN: r260512
Ed Schonberg [Tue, 22 May 2018 13:20:26 +0000 (13:20 +0000)]
[Ada] Spurious size error on fixed point type with aspect Small
This path fixes a spurious size error on a fixed point that carries an
aspect specification for the 'Small of the type, when there is a subsequent
derivation of that type before the type is frozen, the given 'Small is not
not a power of two, and the bounds of the type require its full size, also
given by an aspect specification.
2018-05-22 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* freeze.adb (Freeze_Fixed_Point_Type): If the first subtype has
delayed aspects, analyze them now, os that the representation of the
type (size, bounds) can be computed and validated.
gcc/testsuite/
* gnat.dg/fixedpnt3.adb: New testcase.
From-SVN: r260511
Olivier Hainque [Tue, 22 May 2018 13:20:13 +0000 (13:20 +0000)]
[Ada] Prevent caching of non-text symbols for symbolic tracebacks
We now only have the executable code section boundaries at hand,
so can only infer offsets for symbols within those boundaries.
Symbols outside of this region are non-text symbols, pointless for
traceback symbolization anyway.
2018-05-22 Olivier Hainque <hainque@adacore.com>
gcc/ada/
* libgnat/s-dwalin.adb (Enable_Cache): Skip symbols outside of the
executable code section boundaries.
From-SVN: r260510
Javier Miranda [Tue, 22 May 2018 13:19:24 +0000 (13:19 +0000)]
[Ada] Adding support for Ada.Locales package
This patch adds generic support for the Ada.Locales package that
relies on the setlocale() C service.
2018-05-22 Javier Miranda <miranda@adacore.com>
gcc/ada/
* locales.c: New implementation for the Ada.Locales package.
* libgnat/a-locale.ads: Remove comment indicating that this is not
implemented.
* doc/gnat_rm/standard_library_routines.rst: Remove comment indicating
that this is not implemented.
* gnat_rm.texi: Regenerate.
From-SVN: r260509
Hristian Kirtchev [Tue, 22 May 2018 13:18:45 +0000 (13:18 +0000)]
[Ada] Minor reformattings
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_ch5.adb, freeze.adb, pprint.adb, sem_ch4.adb, sem_res.adb: Minor
reformattings.
From-SVN: r260508
Justin Squirek [Tue, 22 May 2018 13:17:58 +0000 (13:17 +0000)]
[Ada] No error on misplaced pragma Pure_Function
This patch fixes an issue whereby placement of the pragma/aspect Pure_Function
was not verified to have been in the same declarative part as the function
declaration incorrectly allowing it to appear after a function body or in a
different region like a private section.
2018-05-22 Justin Squirek <squirek@adacore.com>
gcc/ada/
* sem_ch12.adb (In_Same_Declarative_Part): Moved to sem_util.
(Freeze_Subprogram_Body, Install_Body): Modify calls to
In_Same_Declarative_Part.
* sem_prag.adb (Analyze_Pragma-Pragma_Pure_Function): Add check to
verify pragma declaration is within the same declarative list with
corresponding error message.
* sem_util.adb, sem_util.ads (In_Same_Declarative_Part): Moved from
sem_ch12.adb and generalized to be useful outside the scope of
freezing.
gcc/testsuite/
* gnat.dg/pure_function1.adb, gnat.dg/pure_function1.ads,
gnat.dg/pure_function2.adb, gnat.dg/pure_function2.ads: New testcases.
From-SVN: r260507
Hristian Kirtchev [Tue, 22 May 2018 13:17:22 +0000 (13:17 +0000)]
[Ada] Missing error on illegal categorization dependency
This patch modifies the analysis of subprogram declarations to ensure that an
aspect which is converted into a categorization pragma is properly taken into
account when verifying the dependencies of a subprogram unit.
------------
-- Source --
------------
-- pack.ads
package Pack is end Pack;
-- proc1.ads
with Pack;
procedure Proc1 with Pure;
-- proc2.ads
with Pack;
procedure Proc2;
pragma Pure (Proc2);
----------------------------
-- Compilation and output --
----------------------------
$ gcc -c proc1.ads
$ gcc -c proc2.ads
proc1.ads:1:06: cannot depend on "Pack" (wrong categorization)
proc1.ads:1:06: pure unit cannot depend on non-pure unit
proc2.ads:1:06: cannot depend on "Pack" (wrong categorization)
proc2.ads:1:06: pure unit cannot depend on non-pure unit
2018-05-22 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* sem_ch6.adb (Analyze_Subprogram_Declaration): Set the proper
categorization of the unit after processing the aspects in case one of
its aspects is converted into a categorization pragma.
From-SVN: r260506
Richard Sandiford [Tue, 22 May 2018 12:25:44 +0000 (12:25 +0000)]
Handle a null lhs in expand_direct_optab_fn (PR85862)
This PR showed that the normal function for expanding directly-mapped
internal functions didn't handle the case in which the call was only
being kept for its side-effects.
2018-05-22 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
PR middle-end/85862
* internal-fn.c (expand_direct_optab_fn): Cope with a null lhs.
gcc/testsuite/
PR middle-end/85862
* gcc.dg/torture/pr85862.c: New test.
From-SVN: r260504
Richard Biener [Tue, 22 May 2018 11:25:14 +0000 (11:25 +0000)]
re PR tree-optimization/85834 (ice in set_ssa_val_to, at tree-ssa-sccvn.c:3396)
2018-05-22 Richard Biener <rguenther@suse.de>
PR tree-optimization/85834
* tree-ssa-sccvn.c (vn_reference_lookup_3): Properly handle
non-constant and non-zero memset arguments.
* g++.dg/torture/pr85834.C: New testcase.
* gcc.dg/tree-ssa/ssa-fre-64.c: Likewise.
From-SVN: r260503
Martin Liska [Tue, 22 May 2018 10:50:43 +0000 (12:50 +0200)]
Do not ICE for incomplete types in ICF (PR ipa/85607).
2018-05-22 Martin Liska <mliska@suse.cz>
PR ipa/85607
* ipa-icf.c (sem_item::add_type): Do not ICE for incomplete types.
2018-05-22 Martin Liska <mliska@suse.cz>
PR ipa/85607
* g++.dg/ipa/pr85607.C: New test.
From-SVN: r260502
Richard Biener [Tue, 22 May 2018 09:55:49 +0000 (09:55 +0000)]
re PR tree-optimization/85863 (ICE in compiling spec2006 fortran test case solib.fppized.f starting with r260283)
2018-05-22 Richard Biener <rguenther@suse.de>
PR tree-optimization/85863
* tree-vect-stmts.c (vect_is_simple_cond): Only widen invariant
comparisons when vectype is specified.
(vectorizable_condition): Do not specify vectype for
vect_is_simple_cond when SLP vectorizing.
* gfortran.fortran-torture/compile/pr85863.f: New testcase.
From-SVN: r260501
Bin Cheng [Tue, 22 May 2018 08:26:50 +0000 (08:26 +0000)]
* MAINTAINERS (loop-optimizer): Add myself.
From-SVN: r260500
Janus Weil [Tue, 22 May 2018 05:41:45 +0000 (07:41 +0200)]
re PR fortran/85841 ([F2018] reject deleted features)
2018-05-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/85841
* libgfortran.h: Remove the macros GFC_STD_F2008_TS and
GFC_STD_OPT_F08TS.
* error.c (notify_std_msg): Remove GFC_STD_F2008_TS.
* options.c (set_default_std_flags): Ditto.
(gfc_handle_option): Make -std=f2008ts an alias for -std=f2018.
* array.c (gfc_match_array_spec): Replace GFC_STD_F2008_TS by
GFC_STD_F2018.
* check.c (gfc_check_atomic, gfc_check_event_query,
gfc_check_c_f_pointer, gfc_check_c_f_procpointer, gfc_check_c_funloc,
gfc_check_c_loc, gfc_check_num_images, gfc_check_this_image): Ditto.
* decl.c (gfc_verify_c_interop_param, gfc_match_decl_type_spec): Ditto.
* intrinsic.c (add_functions, add_subroutines,
gfc_check_intrinsic_standard): Ditto.
* iso-c-binding.def: Ditto.
* iso-fortran-env.def: Ditto.
* match.c (gfc_match_event_post, gfc_match_event_wait,
gfc_match_fail_image, gfc_match_form_team, gfc_match_change_team,
gfc_match_end_team, gfc_match_sync_team): Ditto.
* gfortran.texi: Remove mention of -std=f2008ts.
Move TSs into F2018 section.
* invoke.texi: Update documentation of -std=f2008ts.
2018-05-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/85841
* gfortran.dg/assumed_rank_5.f90: Update error message.
* gfortran.dg/assumed_type_4.f90: Ditto.
* gfortran.dg/bind_c_array_params.f03: Ditto.
* gfortran.dg/bind_c_usage_28.f90: Ditto.
* gfortran.dg/c_funloc_tests_5.f03: Ditto.
* gfortran.dg/c_funloc_tests_6.f90: Ditto.
* gfortran.dg/c_loc_tests_11.f03: Ditto.
* gfortran.dg/coarray_atomic_2.f90: Ditto.
* gfortran.dg/coarray_collectives_2.f90: Ditto.
* gfortran.dg/coarray_collectives_10.f90: Ditto.
* gfortran.dg/coarray_collectives_13.f90: Ditto.
* gfortran.dg/rank_3.f90: Ditto.
* gfortran.dg/error_stop_4.f90: Replace -std=f2008ts by -std=f2008.
* gfortran.dg/implicit_14.f90: Ditto.
From-SVN: r260499
GCC Administrator [Tue, 22 May 2018 00:16:41 +0000 (00:16 +0000)]
Daily bump.
From-SVN: r260497
Joseph Myers [Mon, 21 May 2018 23:40:02 +0000 (00:40 +0100)]
* es.po: Update.
From-SVN: r260492
Christian Groessler [Mon, 21 May 2018 22:42:35 +0000 (22:42 +0000)]
simd-5.c: Fix comment.
2018-05-21 Christian Groessler <chris@groessler.org>
* gcc.c-torture/compile/simd-5.c: Fix comment.
From-SVN: r260491
Michael Meissner [Mon, 21 May 2018 22:25:03 +0000 (22:25 +0000)]
re PR target/85657 (Make __ibm128 a separate type, even if long double uses the IBM double-double format)
2018-05-21 Michael Meissner <meissner@linux.ibm.com>
PR target/85657
* config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Do not
define __ibm128 as long double.
* config/rs6000/rs6000.c (rs6000_init_builtins): Create __ibm128
as a distinct type with IEEE 128-bit floating point is supported.
(init_float128_ieee): Fix up conversions between IFmode and IEEE
128-bit types to use the correct functions.
(rs6000_expand_float128_convert): Use explicit FLOAT_EXTEND to
convert between 128-bit floating point types that have different
modes but the same representation, instead of using gen_lowpart to
makean alias.
* config/rs6000/rs6000.md (IFKF): New iterator for IFmode and
KFmode.
(IFKF_reg): New attributes to give the register constraints for
IFmode and KFmode.
(extend<mode>tf2_internal): New insns to mark an explicit
conversion between 128-bit floating point types that have a
different mode but share the same representation.
[gcc/testsuite]
2018-05-21 Michael Meissner <meissner@linux.ibm.com>
PR target/85657
* gcc.target/powerpc/pr85657-1.c: New test for converting between
__float128, __ibm128, and long double.
* gcc.target/powerpc/pr85657-2.c: Likewise.
* gcc.target/powerpc/pr85657-3.c: Likewise.
* g++.dg/pr85667.C: New test to make sure __ibm128 is
implementated as a separate type internally, and is not just an
alias for long double.
From-SVN: r260490
Michael Meissner [Mon, 21 May 2018 22:21:40 +0000 (22:21 +0000)]
re PR target/85657 (Make __ibm128 a separate type, even if long double uses the IBM double-double format)
[gcc]
2018-05-21 Michael Meissner <meissner@linux.ibm.com>
PR target/85657
* config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Do not
define __ibm128 as long double.
* config/rs6000/rs6000.c (rs6000_init_builtins): Always create
__ibm128 as a distinct type.
(init_float128_ieee): Fix up conversions between IFmode and IEEE
128-bit types to use the correct functions.
(rs6000_expand_float128_convert): Use explicit FLOAT_EXTEND to
convert between 128-bit floating point types that have different
modes but the same representation, instead of using gen_lowpart to
makean alias.
* config/rs6000/rs6000.md (IFKF): New iterator for IFmode and
KFmode.
(IFKF_reg): New attributes to give the register constraints for
IFmode and KFmode.
(extend<mode>tf2_internal): New insns to mark an explicit
conversion between 128-bit floating point types that have a
different mode but share the same representation.
[gcc/testsuite]
2018-05-21 Michael Meissner <meissner@linux.ibm.com>
PR target/85657
* gcc.target/powerpc/pr85657-1.c: New test for converting between
__float128, __ibm128, and long double.
* gcc.target/powerpc/pr85657-2.c: Likewise.
* gcc.target/powerpc/pr85657-3.c: Likewise.
* g++.dg/pr85667.C: New test to make sure __ibm128 is
implementated as a separate type internally, and is not just an
alias for long double.
From-SVN: r260489
Richard Sandiford [Mon, 21 May 2018 22:02:35 +0000 (22:02 +0000)]
Fix tree-ssa-strlen handling of partial clobbers (PR85814)
In this PR we have:
c_5 = c_4(D) + 4;
c_12 = c_5 + 1;
*c_5 = 2;
a = 2; // A
c_21 = c_12 + 1;
*c_12 = 2;
a = 2; // B
c_28 = c_21 + 1;
*c_21 = 2;
a = 2;
c_7 = c_28 + 1;
*c_28 = 2;
where a is a global int. We decide that A can't clobber *c_5 == c_4[4]
because the latter implies that c_4 is an object of 5 bytes or more,
whereas a has exactly 4 bytes.
The assumption for B and *c_5 is the same, but when considering B and
*c_12, we only follow the definition of c_12 to c_5 + 1 (for good
reason) and so have *c_12 == c_5[1]. We then don't have the same
size guarantee and so assume that B could clobber *c_12. This leads
to a situation in which the strinfo for c_5 is still valid but the
next strinfo (c_12) isn't. We then segfaulted while trying to get
the strinfo for c_21 + 1 == c_5 + 3 because get_stridx_plus_constant
assumed that c_5's next strinfo (c_12) would be valid too.
And of course it should be valid really. It doesn't make sense for the
string based at c_5 to be valid but a substring of it to be invalid.
I don't think we can guarantee that such weird corner cases never
happen though, even if we tried to avoid this one.
One possibility would be to mark c_12 as valid on the basis that c_5
is valid, but I'm not sure the complication is worth it given that it
seems to trigger very rarely. A better optimisation would be to get
the unroller to clean up after itself a bit more...
Although this particular instance of the bug relies on r249880, I think
we could have similar problems in GCC 7. It would be much harder to
trigger though, especially since it relies on unfolded IR like the above.
2018-05-21 Richard Sandiford <richard.sandiford@linaro.org>
gcc/
PR tree-optimization/85814
* tree-ssa-strlen.c (get_stridx_plus_constant): Cope with
a null return from get_strinfo when unsharing the next
strinfo in the chain.
gcc/testsuite/
PR tree-optimization/85814
* gcc.dg/torture/pr85814.c: New test.
From-SVN: r260488
Janus Weil [Mon, 21 May 2018 20:48:59 +0000 (22:48 +0200)]
re PR fortran/85841 ([F2018] reject deleted features)
2018-05-21 Janus Weil <janus@gcc.gnu.org>
PR fortran/85841
PR testsuite/85865
* testsuite/libgomp.fortran/collapse2.f90: Add option "-std=legacy".
* testsuite/libgomp.fortran/omp_atomic2.f90: Ditto.
* testsuite/libgomp.fortran/omp_parse1.f90: Ditto.
* testsuite/libgomp.fortran/omp_parse3.f90: Ditto.
* testsuite/libgomp.fortran/task2.f90: Ditto.
* testsuite/libgomp.fortran/vla1.f90: Ditto.
* testsuite/libgomp.fortran/vla2.f90: Ditto.
* testsuite/libgomp.fortran/vla3.f90: Ditto.
* testsuite/libgomp.fortran/vla4.f90: Ditto.
* testsuite/libgomp.fortran/vla5.f90: Ditto.
* testsuite/libgomp.fortran/vla6.f90: Ditto.
* testsuite/libgomp.fortran/vla8.f90: Ditto.
* testsuite/libgomp.oacc-fortran/collapse-2.f90: Ditto.
* testsuite/libgomp.oacc-fortran/nested-function-1.f90: Ditto.
From-SVN: r260487
Paolo Carlini [Mon, 21 May 2018 20:44:33 +0000 (20:44 +0000)]
parser.c (cp_parser_parameter_declaration_list): Remove bool* parameter.
2018-05-21 Paolo Carlini <paolo.carlini@oracle.com>
* parser.c (cp_parser_parameter_declaration_list): Remove
bool* parameter.
(cp_parser_parameter_declaration_clause): Adjust.
(cp_parser_cache_defarg): Likewise.
From-SVN: r260486
Vladimir Mezentsev [Mon, 21 May 2018 20:30:00 +0000 (20:30 +0000)]
re PR target/84923 (gcc.dg/attr-weakref-1.c failed on aarch64)
PR gcc/84923
* varasm.c (weak_finish): Clean up weak_decls.
From-SVN: r260485
Paolo Carlini [Mon, 21 May 2018 19:25:50 +0000 (19:25 +0000)]
re PR c++/84588 (internal compiler error: Segmentation fault (contains_struct_check()))
/cp
2018-05-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84588
* parser.c (cp_parser_maybe_commit_to_declaration,
cp_parser_check_condition_declarator): New.
(cp_parser_simple_declaration): Use the first above.
(cp_parser_condition): Use both the above; enforce
[stmt.stmt]/2 about the declarator not specifying
a function or an array; improve error-recovery.
/testsuite
2018-05-21 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84588
* g++.dg/cpp0x/cond1.C: New.
* g++.dg/cpp1y/pr84588-1.C: Likewise.
* g++.dg/cpp1y/pr84588-2.C: Likewise.
* g++.dg/cpp1y/pr84588-3.C: Likewise.
* g++.dg/parse/cond6.C: Likewise.
* g++.dg/parse/cond7.C: Likewise.
* g++.dg/parse/cond8.C: Likewise.
* g++.dg/cpp1z/decomp16.C: Update.
* g++.old-deja/g++.jason/cond.C: Likewise.
From-SVN: r260482
Steven G. Kargl [Mon, 21 May 2018 19:22:46 +0000 (19:22 +0000)]
ChangeLog for r260480
2018-05-21 Steven G. Kargl <kargl@gcc.gnu.org>
ChangeLog for r260480
* gfortran.dg/graphite/block-2.f: Adjust testcase for new gfortran
warnings for deleted and obsolescent features.
* gfortran.dg/graphite/id-19.f: Ditto.
* gfortran.dg/graphite/id-20.f: Ditto.
* gfortran.dg/graphite/id-27.f90: Ditto.
* gfortran.dg/graphite/pr82449.f: Ditto.
From-SVN: r260481
Steven G. Kargl [Mon, 21 May 2018 19:19:25 +0000 (19:19 +0000)]
block-2.f: Adjust testcase for new gfortran warnings for deleted and obsolescent features.
2018-05-21 Steven G. Kargl <kargl@gcc.gnu.org>
* gfortran.dg/graphite/block-2.f: Adjust testcase for new gfortran
warnings for deleted and obsolescent features.
* gfortran.dg/graphite/id-19.f: Ditto.
* gfortran.dg/graphite/id-20.f: Ditto.
* gfortran.dg/graphite/id-27.f90: Ditto.
* gfortran.dg/graphite/pr82449.f: Ditto.
From-SVN: r260480
Jonathan Wakely [Mon, 21 May 2018 17:18:35 +0000 (18:18 +0100)]
Add support for opening file streams from wide character strings
C++17 added new overloads to <fstream> class templates to support
opening files from wide character strings "on systems where
filesystem::path::value_type is not char". This patch adds those
overloads conditional on _wfopen being available, and enables them for
pre-C++17 modes as well.
Add support for opening file streams from wide character strings.
* config/io/basic_file_stdio.cc [_GLIBCXX_HAVE__WFOPEN]
(__basic_file<char>::open(const wchar_t*, ios_base::openmode)):
Define new overload.
* config/io/basic_file_stdio.h [_GLIBCXX_HAVE__WFOPEN]
(__basic_file<char>::open(const wchar_t*, ios_base::openmode)):
Declare new overload.
* configure.ac: Check for _wfopen.
* crossconfig.m4: Likewise.
* configure: Regenerate.
* config.h.in: Regenerate.
* include/bits/fstream.tcc [_GLIBCXX_HAVE__WFOPEN]
(basic_filebuf<C,T>::open(const wchar_t*, ios_base::openmode)):
Define new overload.
* include/std/fstream [_GLIBCXX_HAVE__WFOPEN]
(basic_filebuf<C,T>::open(const wchar_t*, ios_base::openmode)):
Declare new overload.
[_GLIBCXX_HAVE__WFOPEN]
(basic_ifstream<C,T>::basic_ifstream(const wchar_t*, openmode))
(basic_ifstream<C,T>::basic_open(const wchar_t*, openmode))
(basic_ofstream<C,T>::basic_ifstream(const wchar_t*, openmode))
(basic_ofstream<C,T>::basic_open(const wchar_t*, openmode))
(basic_fstream<C,T>::basic_ifstream(const wchar_t*, openmode))
(basic_fstream<C,T>::basic_open(const wchar_t*, openmode)): Define
new overloads.
* testsuite/27_io/basic_filebuf/open/wchar_t/1.cc: New.
* testsuite/27_io/basic_ifstream/cons/wchar_t/1.cc: New.
* testsuite/27_io/basic_ifstream/open/wchar_t/1.cc: New.
* testsuite/27_io/basic_ofstream/cons/wchar_t/1.cc: New.
* testsuite/27_io/basic_ofstream/open/wchar_t/1.cc: New.
* testsuite/27_io/basic_fstream/cons/wchar_t/1.cc: New.
* testsuite/27_io/basic_fstream/open/wchar_t/1.cc: New.
From-SVN: r260479
François Dumont [Mon, 21 May 2018 16:51:47 +0000 (16:51 +0000)]
re PR libstdc++/85845 (Many libstdc++ test failures)
2018-05-21 François Dumont <fdumont@gcc.gnu.org>
PR libstdc++/85845
* include/bits/stl_tree.h
(_Rb_tree_impl(_Rb_tree_impl&&, _Node_allocator&&)): Fix noexcept
qualification.
From-SVN: r260478
Kyrylo Tkachov [Mon, 21 May 2018 15:58:32 +0000 (15:58 +0000)]
[AArch64][committed] Fix gcc.target/aarch64/vec_init_1.c for tiny and large mcmodels
This recently-committed test fails the INS scan for tiny and large memory models.
That is because instead of the:
make_vector:
adrp x1, a
adrp x0, b
movi v0.4s, 0
ldr s2, [x1, #:lo12:a]
ldr s1, [x0, #:lo12:b]
ins v0.s[2], v2.s[0]
ins v0.s[3], v1.s[0]
ret
That we generate for the default small model, we end up with a simple register
addressing mode with no addend/offset for the lane load:
make_vector:
movi v0.4s, 0
adr x1, a
adr x0, b
ld1 {v0.s}[2], [x1]
ld1 {v0.s}[3], [x0]
ret
and
make_vector:
movi v0.4s, 0
adrp x0, .LC0
ldr x1, [x0, #:lo12:.LC0]
adrp x0, .LC1
ldr x0, [x0, #:lo12:.LC1]
ld1 {v0.s}[2], [x1]
ld1 {v0.s}[3], [x0]
ret
So we end up merging the load and the lane insert.
This patch adjusts the testcase to scan for the right thing accordingly.
Checked that the testcase passes with -mcmodel=tiny, -mcmodel=small, -mcmodel=large.
* gcc.target/aarch64/vec_init_1.c: Scan for LD1 instead of INS for
tiny and large memory models.
From-SVN: r260474
Pierre-Marie de Rodat [Mon, 21 May 2018 14:57:38 +0000 (14:57 +0000)]
Fix bogous dates in gcc/ada/ChangeLog
From-SVN: r260472
Ed Schonberg [Mon, 21 May 2018 14:52:36 +0000 (14:52 +0000)]
[Ada] Spurious warning on object declaration with address clause
The compiler warns on an object declaration with default initialization
and an address clause, to indicate that the overlay implied by the address
clause might affect a value elsewhere. The warning is suppressed if the type
carries the Suppress_Initialization aspect. With this patch the compiler
also inhibits the warning if the aspect is specified for the object itself.
2018-05-21 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* freeze.adb (Warn_Overlay): Do not emit a wawrning on an object
declaration with an explicit address clause and a type with default
initialization, if the declaration carries an aspect
Suppress_Initialization.
gcc/testsuite/
* gnat.dg/suppress_initialization.adb,
gnat.dg/suppress_initialization_pkg.ads: New testcase.
From-SVN: r260471
Daniel Mercier [Mon, 21 May 2018 14:52:31 +0000 (14:52 +0000)]
[Ada] Pretty-print attribute names using mixed case
2018-05-21 Daniel Mercier <mercier@adacore.com>
gcc/ada/
* pprint.adb: Use mixed case for attribute names.
From-SVN: r260470
Hristian Kirtchev [Mon, 21 May 2018 14:52:24 +0000 (14:52 +0000)]
[Ada] Aspects on stubs
This patch ensures that aspect specifications which appear on package,
protected, and task body stubs are properly analyzed.
------------
-- Source --
------------
-- pack.ads
package Pack
with SPARK_Mode,
Abstract_State => State
is
-------------------------------------
-- Refined_Depends, Refined_Global --
-------------------------------------
procedure Proc_1;
procedure Proc_2
with Global => (In_Out => State),
Depends => (State => State);
task Task_Obj_1;
task Task_Obj_2
with Global => (In_Out => State),
Depends => (State => State);
------------------
-- Refined_Post --
------------------
function Func_1 (Formal : Integer) return Integer;
function Func_2 (Formal : Integer) return Integer
with Post => Func_2'Result > Formal;
-------------------
-- Refined_State --
-------------------
package Pack_1 is end Pack_1;
package Pack_2 with Abstract_State => State_2 is end Pack_2;
----------------
-- SPARK_Mode --
----------------
package Pack_3 with SPARK_Mode => Off is end Pack_3;
package Pack_4 with SPARK_Mode => Off is end Pack_4;
package Pack_5 is end Pack_5;
protected type Prot_Typ_1 with SPARK_Mode => Off is end Prot_Typ_1;
protected type Prot_Typ_2 with SPARK_Mode => Off is end Prot_Typ_2;
protected type Prot_Typ_3 is end Prot_Typ_3;
procedure Proc_3 with SPARK_Mode => Off;
procedure Proc_4 with SPARK_Mode => Off;
procedure Proc_5;
task type Task_Typ_1 with SPARK_Mode => Off;
task type Task_Typ_2 with SPARK_Mode => Off;
task type Task_Typ_3;
end Pack;
-- pack.adb
package body Pack
with SPARK_Mode,
Refined_State => (State => Constit)
is
Constit : Integer := 0;
-------------------------------------
-- Refined_Depends, Refined_Global --
-------------------------------------
procedure Proc_1 is separate
with Refined_Global => (In_Out => Constit), -- Error
Refined_Depends => (Constit => Constit); -- Error
procedure Proc_2 is separate
with Refined_Global => (In_Out => Constit), -- OK
Refined_Depends => (Constit => Constit); -- OK
task body Task_Obj_1 is separate
with Refined_Global => (In_Out => Constit), -- Error
Refined_Depends => (Constit => Constit); -- Error
task body Task_Obj_2 is separate
with Refined_Global => (In_Out => Constit), -- OK
Refined_Depends => (Constit => Constit); -- OK
------------------
-- Refined_Post --
------------------
function Func_1 (Formal : Integer) return Integer is separate
with Refined_Post => Func_1'Result > Formal; -- OK
function Func_2 (Formal : Integer) return Integer is separate
with Refined_Post => Func_2'Result > Formal; -- OK
-------------------
-- Refined_State --
-------------------
package body Pack_1 is separate
with Refined_State => (State_1 => Constit_1); -- Error
package body Pack_2 is separate
with Refined_State => (State_2 => Constit_2); -- Error
----------------
-- SPARK_Mode --
----------------
package body Pack_3 is separate with SPARK_Mode => On; -- Error
package body Pack_4 is separate;
package body Pack_5 is separate with SPARK_Mode => Off; -- Error
protected body Prot_Typ_1 is separate with SPARK_Mode => On; -- Error
protected body Prot_Typ_2 is separate;
protected body Prot_Typ_3 is separate with SPARK_Mode => Off; -- Error
procedure Proc_3 is separate with SPARK_Mode => On; -- Error
procedure Proc_4 is separate;
procedure Proc_5 is separate with SPARK_Mode => Off; -- Error
task body Task_Typ_1 is separate with SPARK_Mode => On; -- Error
task body Task_Typ_2 is separate;
task body Task_Typ_3 is separate with SPARK_Mode => Off; -- Error
end Pack;
-- pack-func_1.adb
separate (Pack)
function Func_1 (Formal : Integer) return Integer
with Refined_Post => Func_1'Result > Formal -- Error
is
begin
return Formal * 10;
end Func_1;
-- pack-func_2.adb
separate (Pack)
function Func_2 (Formal : Integer) return Integer
with Refined_Post => Func_2'Result > Formal -- Error
is
begin
return Formal * 10;
end Func_2;
-- pack-pack_1.adb
separate (Pack)
package body Pack_1
with SPARK_Mode,
Refined_State => (State_1 => Constit_1) -- Error
is
Constit_1 : Integer := 1;
end Pack_1;
-- pack-pack_2.adb
separate (Pack)
package body Pack_2
with SPARK_Mode,
Refined_State => (State_2 => Constit_2) -- OK
is
Constit_2 : Integer := 2;
end Pack_2;
-- pack-pack_3.adb
separate (Pack)
package body Pack_3 is end Pack_3;
-- pack-pack_4.adb
separate (Pack)
package body Pack_4 with SPARK_Mode => On is end Pack_4; -- OK
-- pack-pack_5.adb
separate (Pack)
package body Pack_5 with SPARK_Mode => On is end Pack_5; -- OK
-- pack-proc_1.adb
separate (Pack)
procedure Proc_1
with Refined_Global => (In_Out => Constit), -- Error
Refined_Depends => (Constit => Constit) -- Error
is begin null; end Proc_1;
-- pack-proc_2.adb
separate (Pack)
procedure Proc_2
with Refined_Global => (In_Out => Constit), -- Error
Refined_Depends => (Constit => Constit) -- Error
is begin null; end Proc_2;
-- pack-proc_3.adb
separate (Pack)
procedure Proc_3 is begin null; end Proc_3;
-- pack-proc_4.adb
separate (Pack)
procedure Proc_4 with SPARK_Mode => On is begin null; end Proc_4; -- OK
-- pack-proc_5.adb
separate (Pack)
procedure Proc_5 with SPARK_Mode => On is begin null; end Proc_5; -- OK
-- pack-prot_typ_1.adb
separate (Pack)
protected body Prot_Typ_1 is end Prot_Typ_1;
-- pack-prot_typ_2.adb
separate (Pack)
protected body Prot_Typ_2 with SPARK_Mode => On is end Prot_Typ_2; -- OK
-- pack-prot_typ_3.adb
separate (Pack)
protected body Prot_Typ_3 with SPARK_Mode => On is end Prot_Typ_3; -- OK
-- pack-task_obj_1.adb
separate (Pack)
task body Task_Obj_1
with Refined_Global => (In_Out => Constit), -- Error
Refined_Depends => (Constit => Constit) -- Error
is begin null; end Task_Obj_1;
-- pack-task_obj_2.adb
separate (Pack)
task body Task_Obj_2
with Refined_Global => (In_Out => Constit), -- Error
Refined_Depends => (Constit => Constit) -- Error
is begin null; end Task_Obj_2;
-- pack-task_typ_1.adb
separate (Pack)
task body Task_Typ_1 is begin null; end Task_Typ_1;
-- pack-task_typ_2.adb
separate (Pack)
task body Task_Typ_2 with SPARK_Mode => On is -- OK
begin null; end Task_Typ_2;
-- pack-task_typ_3.adb
separate (Pack)
task body Task_Typ_3 with SPARK_Mode => On is -- OK
begin null; end Task_Typ_3;
----------------------------
-- Compilation and output --
----------------------------
$ gcc -c pack.adb
pack.adb:12:11: useless refinement, declaration of subprogram "Proc_1" lacks
aspect or pragma Global
pack.adb:13:11: useless refinement, declaration of subprogram "Proc_1" lacks
aspect or pragma Depends
pack.adb:20:11: useless refinement, declaration of task type "Task_Obj_1" lacks
aspect or pragma Global
pack.adb:21:11: useless refinement, declaration of task type "Task_Obj_1" lacks
aspect or pragma Depends
pack.adb:42:11: aspect "Refined_State" must apply to a package body
pack.adb:45:11: aspect "Refined_State" must apply to a package body
pack.adb:51:41: incorrect placement of aspect "Spark_Mode"
pack.adb:53:41: incorrect placement of aspect "Spark_Mode"
pack.adb:55:47: incorrect placement of aspect "Spark_Mode"
pack.adb:57:47: incorrect placement of aspect "Spark_Mode"
pack.adb:59:38: incorrect placement of aspect "Spark_Mode"
pack.adb:61:38: incorrect placement of aspect "Spark_Mode"
pack.adb:63:42: incorrect placement of aspect "Spark_Mode"
pack.adb:65:42: incorrect placement of aspect "Spark_Mode"
pack-proc_1.adb:4:08: aspect "Refined_Global" cannot apply to a subunit
pack-proc_1.adb:5:08: aspect "Refined_Depends" cannot apply to a subunit
pack-proc_2.adb:4:08: aspect "Refined_Global" cannot apply to a subunit
pack-proc_2.adb:5:08: aspect "Refined_Depends" cannot apply to a subunit
pack-task_obj_1.adb:4:08: aspect "Refined_Global" cannot apply to a subunit
pack-task_obj_1.adb:5:08: aspect "Refined_Depends" cannot apply to a subunit
pack-task_obj_2.adb:4:08: aspect "Refined_Global" cannot apply to a subunit
pack-task_obj_2.adb:5:08: aspect "Refined_Depends" cannot apply to a subunit
pack-func_1.adb:4:08: aspect "Refined_Post" cannot apply to a subunit
pack-func_2.adb:4:08: aspect "Refined_Post" cannot apply to a subunit
pack-pack_1.adb:3:14: body of package "Pack_1" has unused hidden states
pack-pack_1.adb:3:14: variable "Constit_1" defined at line 7
pack-pack_1.adb:5:08: useless refinement, package "Pack_1" does not define
abstract states
pack-pack_1.adb:5:26: "State_1" is undefined
pack-pack_3.adb:3:01: incorrect use of SPARK_Mode at pack.adb:2
pack-pack_3.adb:3:01: value Off was set for SPARK_Mode on "Pack_3" at
pack.ads:38
pack-pack_4.adb:3:01: incorrect use of SPARK_Mode at pack.adb:2
pack-pack_4.adb:3:01: value Off was set for SPARK_Mode on "Pack_4" at
pack.ads:39
pack-pack_4.adb:3:26: incorrect use of SPARK_Mode
pack-pack_4.adb:3:26: value Off was set for SPARK_Mode on "Pack_4" at
pack.ads:39
pack-prot_typ_2.adb:3:32: incorrect use of SPARK_Mode
pack-prot_typ_2.adb:3:32: value Off was set for SPARK_Mode on "Prot_Typ_2" at
pack.ads:43
pack-proc_3.adb:3:01: incorrect use of SPARK_Mode at pack.adb:2
pack-proc_3.adb:3:01: value Off was set for SPARK_Mode on "Proc_3" at
pack.ads:46
pack-proc_4.adb:3:01: incorrect use of SPARK_Mode at pack.adb:2
pack-proc_4.adb:3:01: value Off was set for SPARK_Mode on "Proc_4" at
pack.ads:47
pack-proc_4.adb:3:23: incorrect use of SPARK_Mode
pack-proc_4.adb:3:23: value Off was set for SPARK_Mode on "Proc_4" at
pack.ads:47
pack-task_typ_2.adb:3:27: incorrect use of SPARK_Mode
pack-task_typ_2.adb:3:27: value Off was set for SPARK_Mode on "Task_Typ_2" at
pack.ads:51
2018-05-21 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* sem_ch6.adb (Analyze_Generic_Subprogram_Body): Rename the call to
Analyze_Aspect_Specifications_On_Body_Or_Stub.
(Analyze_Subprogram_Body_Helper): Rename the calls to
Analyze_Aspect_Specifications_On_Body_Or_Stub.
* sem_ch9.adb (Analyze_Entry_Body): Rename the call to
Analyze_Aspect_Specifications_On_Body_Or_Stub.
* sem_ch10.adb: Add with and use clause for Sem_Ch13.
(Analyze_Package_Body_Stub): Add constant Id. Decorate the package stub
prior to analyzing its aspects.
(Analyze_Protected_Body_Stub): Add constant Id. Decorate the package
stub prior to analyzing its aspects. Save and restore the configuration
switches.
(Analyze_Task_Body_Stub): Add constant Id. Decorate the package stub
prior to analyzing its aspects.
* sem_ch13.adb (Analyze_Aspect_Specifications_On_Body_Or_Stub): Renamed
to Analyze_Aspects_On_Subprogram_Body_Or_Stub.
* sem_ch13.ads (Analyze_Aspect_Specifications_On_Body_Or_Stub): Renamed
to Analyze_Aspects_On_Subprogram_Body_Or_Stub.
* sem_prag.adb: Code reformatting.
(Analyze_Refined_Depends_Global_Post): Consider task body stubs.
From-SVN: r260469
Jerome Lambourg [Mon, 21 May 2018 14:52:19 +0000 (14:52 +0000)]
[Ada] Add g-soliop__qnx.ads to the runtime build
This properly links with libsocket when needed by the user code.
2018-05-21 Jerome Lambourg <lambourg@adacore.com>
gcc/ada/
* gcc-interface/Makefile.in: Add g-soliop__qnx.ads to the runtime build
for QNX.
From-SVN: r260468
Hristian Kirtchev [Mon, 21 May 2018 14:52:11 +0000 (14:52 +0000)]
[Ada] Spurious error on early call region of tagged type
This patch corrects the part of the access-before-elaboration mechanism which
ensures that the freeze node of a tagged type is within the early call region
of all its overriding bodies to ignore predefined primitives.
------------
-- Source --
------------
-- pack.ads
package Pack with SPARK_Mode is
type Parent_Typ is tagged null record;
procedure Prim (Obj : Parent_Typ);
type Deriv_Typ is new Parent_Typ with private;
overriding procedure Prim (Obj : Deriv_Typ);
private
type Deriv_Typ is new Parent_Typ with null record;
end Pack;
-----------------
-- Compilation --
-----------------
$ gcc -c pack.ads
2018-05-21 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_cg.adb: Remove with and use clause for Exp_Disp.
* exp_ch9.adb: Remove with and use clause for Exp_Disp.
* exp_disp.adb (Is_Predefined_Dispatching_Operation): Moved to Sem_Util.
(Is_Predefined_Interface_Primitive): Moved to Sem_Util.
(Is_Predefined_Internal_Operation): Moved to Sem_Util.
* exp_disp.ads (Is_Predefined_Dispatching_Operation): Moved to Sem_Util.
(Is_Predefined_Interface_Primitive): Moved to Sem_Util.
(Is_Predefined_Internal_Operation): Moved to Sem_Util.
* exp_dist.adb: Remove with and use clause for Exp_Disp.
* freeze.adb: Remove with and use clause for Exp_Disp.
* sem_cat.adb: Remove with and use clause for Exp_Disp.
* sem_ch6.adb: Remove with and use clause for Exp_Disp.
* sem_ch12.adb: Remove with and use clause for Exp_Disp.
* sem_elab.adb (Check_Overriding_Primitive): Do not process predefined
primitives.
* sem_util.adb: Remove with and use clause for Exp_Disp.
(Is_Predefined_Dispatching_Operation): Moved from Exp_Disp.
(Is_Predefined_Interface_Primitive): Moved from Exp_Disp.
(Is_Predefined_Internal_Operation): Moved from Exp_Disp.
* sem_util.ads (Is_Predefined_Dispatching_Operation): Moved from
Exp_Disp.
(Is_Predefined_Interface_Primitive): Moved from Exp_Disp.
(Is_Predefined_Internal_Operation): Moved from Exp_Disp.
From-SVN: r260467
Ed Schonberg [Mon, 21 May 2018 14:52:05 +0000 (14:52 +0000)]
[Ada] Error message on invalid conversion involving limited views
A type conversion may be illegal if the expression in the conversion has a
limited view of a type. This patch expands the error report to indicate the
presence of a limited view, and when the context is a package body it suggests
the addition of a regular with-clause to make the full view available.
Compiling client.adb must yield:
client.adb:6:16: invalid conversion, not compatible with limited view
of type "Map_Type" defined at maps.ads:2
client.adb:6:16: add with_clause for "Maps" to current unit
----
package Maps is
type Map_Type is null record;
end;
----
limited with Maps;
package Payloads is
function Get_Map return access Maps.Map_Type;
end;
----
with Maps;
package Maps2 is
type New_Map_Type is new Maps.Map_Type;
end;
----
with Maps2;
package Client is
procedure Foo (Map : Maps2.New_Map_Type) is null;
procedure Bar;
end;
----
with Payloads;
package body Client is
procedure Bar is
begin
Foo (Maps2.New_Map_Type (Payloads.Get_Map.all));
end;
end;
2018-05-21 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_res.adb (Valid_Conversion): Improve error message on an illegal
type conversion whose expression has a limited view of a type.
From-SVN: r260466
Ed Schonberg [Mon, 21 May 2018 14:52:00 +0000 (14:52 +0000)]
[Ada] Exit statement in loops over iterable objects
This patch fixes an omission in the expansion of loops over GNAT-specific
iterable objects. If the source includes an explicit name for the loop,
that name has to be preserved in the expanded code to allow exit statements
to mention it.
2018-05-21 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* exp_ch5.adb (Build_Formal_Container_Iteration): If source has
explicit name for iterator loop, preserve that name in expanded
construct, for possible use in exit statements.
gcc/testsuite/
* gnat.dg/exit1.adb: New testcase.
From-SVN: r260465
Javier Miranda [Mon, 21 May 2018 14:51:55 +0000 (14:51 +0000)]
[Ada] Avoid compiler crash for body in non Ada 2012 mode
2018-05-21 Javier Miranda <miranda@adacore.com>
gcc/ada/
* sem_ch4.adb (Analyze_Membership_Op): Avoid compiler crash when the
spec of a unit has Ada 2012 membership tests with multiple choices and
the unit body is not compiled under Ada 2012 mode.
From-SVN: r260464
Doug Rupp [Mon, 21 May 2018 14:51:48 +0000 (14:51 +0000)]
[Ada] Enhance stack unwinding on VxWorks for AArch64
2018-05-21 Doug Rupp <rupp@adacore.com>
gcc/ada/
* sigtramp-vxworks-target.inc: Set cfa_reg properly from sigcontext
pregs.
(CFI_COMMON_REGS): Restore LR jic probed from prologue.
(REGNO_PC_OFFSET): Change to correct value for Aarch64.
From-SVN: r260463
Jose Ruiz [Mon, 21 May 2018 14:51:42 +0000 (14:51 +0000)]
[Ada] Minor typo fixes
2018-05-21 Jose Ruiz <ruiz@adacore.com>
gcc/ada/
* doc/gnat_ugn/gnat_utility_programs.rst, exp_attr.adb,
libgnarl/s-tassta.adb: Minor typo fixes
From-SVN: r260462
Ed Schonberg [Mon, 21 May 2018 14:51:35 +0000 (14:51 +0000)]
[Ada] Spurious error on indexed call as prefix of a call
This patch refines the handling of the well-known syntactic ambiguity created
by a function with defaulted parameters that returns an array, so that F (X)
may designate a call to the function, or an indexing of a parameterless call.
This patch handles the case where such a call is itself the prefix of another
call, and the function is a primitive operation invoked in prefix form.
2018-05-21 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch4.adb (Analyze_One_Call): Recognize complex cases where an
indexed call originally in prefix forn is itself the prefix of a
further call.
gcc/testsuite/
* gnat.dg/array30.adb: New testcase.
From-SVN: r260461
Piotr Trojanek [Mon, 21 May 2018 14:51:30 +0000 (14:51 +0000)]
[Ada] Clarify code for accessing full view of a type
2018-05-21 Piotr Trojanek <trojanek@adacore.com>
gcc/ada/
* sem_eval.adb (Is_Null_Range): Clarify access to the full view of a
type.
(Not_Null_Range): Same as above.
From-SVN: r260460
Hristian Kirtchev [Mon, 21 May 2018 14:51:25 +0000 (14:51 +0000)]
[Ada] Minor reformatting
2018-05-21 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* exp_ch3.adb: Minor reformatting.
* exp_ch6.adb: Likewise.
* freeze.adb: Likewise.
* inline.adb: Likewise.
* sem_util.adb: Likewise.
From-SVN: r260459
Yannick Moy [Mon, 21 May 2018 14:51:19 +0000 (14:51 +0000)]
[Ada] Use type conversion when inlining may trigger a run-time check
In the frontend inlining used in GNATprove, inlining of a return statement
was using an unchecked type conversion, which could cause a necessary
run-time check on the conversion to be skipped. Now fixed.
There is no impact on compilation.
2018-05-21 Yannick Moy <moy@adacore.com>
gcc/ada/
* inline.adb (Expand_Inlined_Call.Process_Formals): Use a type
conversion instead of an unchecked type conversion when inlining a
return statement, unless type qualification is required (for character
and string literal) or no check can result from the conversion (for
access types).
* opt.ads: Update comment.
From-SVN: r260458
Hristian Kirtchev [Mon, 21 May 2018 14:51:15 +0000 (14:51 +0000)]
[Ada] Placement of pragma Elaboration_Checks
This patch modifies the semantics of pragma Elaboration_Checks. The pragma
was intended to be a configuration pragma, however its placement was never
verified until now.
The pragma may appear in the following contexts:
* Configuration pragmas file
* Prior to the context clauses of a compilation unit's initial declaration
Any other placement of the pragma will result in a warning and the effects of
the offending pragma will be ignored.
------------
-- Source --
------------
-- elab_checks_1.adc
pragma Elaboration_Checks (Dynamic);
-- elab_checks_2.adc
pragma Elaboration_Checks (Dynamic);
pragma Elaboration_Checks (Static); -- Error
-- pack_1.ads
pragma Elaboration_Checks (Static); -- OK
package Pack_1 is
end Pack_1;
-- pack_2.ads
pragma Elaboration_Checks (Static); -- OK
pragma Elaboration_Checks (Static); -- Error
package Pack_2 is
end Pack_2;
-- pack_3.ads
package Pack_3 is
procedure Proc;
end Pack_3;
-- pack_3.adb
pragma Elaboration_Checks (Static); -- Error
package body Pack_3 is
procedure Proc is begin null; end Proc;
end Pack_3;
-- pack_4.ads
package Pack_4 is
procedure Proc;
end Pack_4;
-- pack_4.adb
package body Pack_4 is
procedure Proc is separate;
end Pack_4;
-- pack_4-proc.adb
pragma Elaboration_Checks (Static); -- Error
separate (Pack_4)
procedure Proc is begin null; end Proc;
-- gen.ads
generic
with function Called_At_Elaboration return Boolean;
package Gen is
procedure Proc;
end Gen;
-- gen.adb
package body Gen is
procedure Proc is
Obj : constant Boolean := Called_At_Elaboration;
begin null; end Proc;
begin
Proc;
end Gen;
-- abe_static.ads
pragma Elaboration_Checks (Static);
with Gen;
package ABE_Static is
function ABE return Boolean;
package Inst_1 is new Gen (ABE);
end ABE_Static;
-- abe_static.adb
package body ABE_Static is
package Inst_2 is new Gen (ABE);
package Subunit is
end Subunit;
package body Subunit is separate;
function ABE return Boolean is
begin
return True;
end ABE;
end ABE_Static;
-- abe_static-subunit.adb
separate (ABE_Static)
package body Subunit is
package Inst_3 is new Gen (ABE);
package Nested_Subunit is
end Nested_Subunit;
package body Nested_Subunit is separate;
end Subunit;
-- abe_static-subunit-nested_subunit.adb
separate (ABE_Static.Subunit)
package body Nested_Subunit is
package Inst_4 is new Gen (ABE);
end Nested_Subunit;
-- abe_static_main.adb
with ABE_Static;
procedure ABE_Static_Main is begin null; end ABE_Static_Main;
----------------------------
-- Compilation and output --
----------------------------
$ gcc -c pack_1.ads -gnatec=elab_checks_1.adc
$ gcc -c pack_1.ads -gnatec=elab_checks_2.adc
$ gcc -c pack_1.ads
$ gcc -c pack_2.ads
$ gcc -c pack_3.adb
$ gcc -c pack_4.adb
$ gnatmake -q -gnatE abe_static_main.adb
elab_checks_2.adc:2:01: pragma "Elaboration_Checks" duplicates pragma declared
at line 1
pack_2.ads:2:01: pragma "Elaboration_Checks" duplicates pragma declared at line
1
pack_3.adb:1:01: warning: effects of pragma "Elaboration_Checks" are ignored
pack_3.adb:1:01: warning: place pragma on initial declaration of library unit
pack_4-proc.adb:1:01: warning: effects of pragma "Elaboration_Checks" are
ignored
pack_4-proc.adb:1:01: warning: place pragma on initial declaration of library
unit
abe_static.adb:2:04: warning: in instantiation at gen.adb:3
abe_static.adb:2:04: warning: cannot call "ABE" before body seen
abe_static.adb:2:04: warning: Program_Error may be raised at run time
abe_static.adb:2:04: warning: body of unit "ABE_Static" elaborated
abe_static.adb:2:04: warning: procedure "Proc" called at gen.adb:6, instance
at line 2
abe_static.adb:2:04: warning: function "ABE" called at gen.adb:3, instance at
line 2
abe_static.ads:8:04: warning: in instantiation at gen.adb:3
abe_static.ads:8:04: warning: cannot call "ABE" before body seen
abe_static.ads:8:04: warning: Program_Error may be raised at run time
abe_static.ads:8:04: warning: spec of unit "ABE_Static" elaborated
abe_static.ads:8:04: warning: procedure "Proc" called at gen.adb:6, instance
at line 8
abe_static.ads:8:04: warning: function "ABE" called at gen.adb:3, instance at
line 8
abe_static-subunit.adb:4:04: warning: in instantiation at gen.adb:3
abe_static-subunit.adb:4:04: warning: cannot call "ABE" before body seen
abe_static-subunit.adb:4:04: warning: Program_Error may be raised at run time
abe_static-subunit.adb:4:04: warning: body of unit "ABE_Static" elaborated
abe_static-subunit.adb:4:04: warning: procedure "Proc" called at gen.adb:6,
instance at line 4
abe_static-subunit.adb:4:04: warning: function "ABE" called at gen.adb:3,
instance at line 4
abe_static-subunit-nested_subunit.adb:4:04: warning: in instantiation at
gen.adb:3
abe_static-subunit-nested_subunit.adb:4:04: warning: cannot call "ABE" before
body seen
abe_static-subunit-nested_subunit.adb:4:04: warning: Program_Error may be
raised at run time
abe_static-subunit-nested_subunit.adb:4:04: warning: body of unit
"ABE_Static" elaborated
abe_static-subunit-nested_subunit.adb:4:04: warning: procedure "Proc" called
at gen.adb:6, instance at line 4
abe_static-subunit-nested_subunit.adb:4:04: warning: function "ABE" called at
gen.adb:3, instance at line 4
warning: "abe_static_main.adb" has dynamic elaboration checks and with's
warning: "abe_static.ads" which has static elaboration checks
2018-05-21 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Install the elaboration
model of the compilation unit spec, if any.
* sem_ch7.adb (Analyze_Package_Body_Helper): Install the elaboration
model of the compilation unit spec, if any.
* sem_ch10.adb (Analyze_Subunit): Install the elaboration model of the
parent compilation unit spec, if any.
* sem_elab.adb (Check_Elaboration_Scenarios): Restore the elaboration
model of the main unit.
(Is_Same_Unit): The routine now uses Unit_Entity.
(Is_Subunit): Removed.
(Normalize_Unit): Removed.
(Unit_Entity): New routine.
* sem_prag.adb (Analyze_Pragma): Reimplement the handling of pragma
Elaboration_Checks. The analysis now ensures that the pragma appears at
the configuration level, and on the initial declaration of a unit.
Other placements are either flagged as illegal, or ignored.
(Check_Duplicate_Elaboration_Checks_Pragma): New routine.
(Ignore_Elaboration_Checks_Pragma): New routine.
* sem_util.adb (Install_Elaboration_Model): New routine.
* sem_util.ads (Install_Elaboration_Model): New routine.
* doc/gnat_rm/implementation_defined_pragmas.rst: Update the
documentation of pragma Elaboration_Checks.
* gnat_rm.texi: Regenerate.
From-SVN: r260457
Olivier Hainque [Mon, 21 May 2018 14:51:09 +0000 (14:51 +0000)]
[Ada] Robustify traceback caching for executable in current dir
Any program calling Gnat.Traceback.Symbolic.Enable_Cache for
dwarf based symbolization fails with a segmentation violation
when spawned with an inaccurate argv[0] such that it couldn't
be found on PATH.
argv[0] is most often found on PATH. One plausible case where
it isn't is when argv[0] is a mere file name and . isn't on PATH,
which might happen out of imprecise exec calls.
This change robustifies the Traceback.Symbolic implementation
to work in this case as well, by just trying to work with argv[0]
untouched as the executable file to fetch dwarf info from.
2018-05-21 Olivier Hainque <hainque@adacore.com>
gcc/ada/
* libgnat/s-trasym__dwarf.adb (Executable_Name): Return argv[0] instead
of empty string when argv[0] couldn't be found on PATH.
(Enable_Cache): Raise Program_Error instead of attempting a null
pointer dereference when the Exec_Module initialization failed.
From-SVN: r260456
Piotr Trojanek [Mon, 21 May 2018 14:51:04 +0000 (14:51 +0000)]
[Ada] Remove External aspect from predefined abstract states
Explicit External aspect was an equivalant to an implicit default. It was only
needed as a workaround for a frontend bug. (If it meant to serve as
documentation, there should be explicit Effective_Reads and Effective_Writes
set to False too.)
No test, because these changes are semantically neutral.
2018-05-21 Piotr Trojanek <trojanek@adacore.com>
gcc/ada/
* libgnarl/a-reatim.ads (Clock_Time): Remove External aspect.
* libgnarl/a-taside.ads (Tasking_State): Likewise.
* libgnat/a-calend.ads (Clock_Time): Likewise.
From-SVN: r260455
Yannick Moy [Mon, 21 May 2018 14:50:59 +0000 (14:50 +0000)]
[Ada] Spurious error in inlining for GNATprove on prefix call notation
During the special inlining done in GNATprove mode, a call in prefix
notation leads to a spurious error. Now fixed.
2018-05-21 Yannick Moy <moy@adacore.com>
gcc/ada/
* sem_ch6.adb (Analyze_Procedure_Call): Refine test to recognize prefix
call notation in inlined call in GNATprove mode.
From-SVN: r260454
Hristian Kirtchev [Mon, 21 May 2018 14:50:54 +0000 (14:50 +0000)]
[Ada] Spurious error on synchronous refinement
This patch ensures that an abstract state declared with simple option
"synchronous" is automatically considered "external".
2018-05-21 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* einfo.adb (Is_External_State): An abstract state is also external
when it is declared with option "synchronous".
* einfo.ads: Update the documentation of synthesized attribute
Is_External_State.
* sem_util.adb (Find_Simple_Properties): New routine.
(Is_Enabled_External_Property): New routine.
(State_Has_Enabled_Property): Reimplemented. The two flavors of option
External have precedence over option Synchronous when determining
whether a property is in effect.
gcc/testsuite/
* gnat.dg/sync2.adb, gnat.dg/sync2.ads: New testcase.
From-SVN: r260453