aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2022-12-06ada: Allow No_Caching on volatile typesYannick Moy4-45/+84
SPARK RM now allow the property No_Caching on volatile types, to indicate that they should be considered volatile for compilation, but not by GNATprove's analysis. gcc/ada/ * contracts.adb (Add_Contract_Item): Allow No_Caching on types. (Check_Type_Or_Object_External_Properties): Check No_Caching. Check that non-effectively volatile types does not contain an effectively volatile component (instead of just a volatile component). (Analyze_Object_Contract): Remove shared checking of No_Caching. * sem_prag.adb (Analyze_External_Property_In_Decl_Part): Adapt checking of No_Caching for types. (Analyze_Pragma): Allow No_Caching on types. * sem_util.adb (Has_Effectively_Volatile_Component): New query function. (Is_Effectively_Volatile): Type with Volatile and No_Caching is not effectively volatile. (No_Caching_Enabled): Remove assertion to apply to all entities. * sem_util.ads: Same.
2022-12-06ada: Spurious error on nested call using the prefix notationJavier Miranda1-3/+4
gcc/ada/ * exp_ch6.adb (Build_Static_Check_Helper_Call): Perform implicit type conversion to ensure matching types and avoid reporting spurious errors.
2022-12-06ada: Suppress warning for specific constant valid conditionEric Botcazou1-1/+39
Like in Exp_Ch4, we do not want to give warnings in Sem_Warn on a membership test with a mark for a subtype that is predicated. gcc/ada/ * sem_warn.adb (Warn_On_Constant_Valid_Condition): Bail out for a membership test with a mark for a subtype that is predicated.
2022-12-06ada: Fix spurious error in checking of SPARK elaborationEric Botcazou1-1/+23
The problem is that the computation of early call regions skips freeze nodes but scenarios involving procedures declared as actions of these freeze nodes are taken into account. As a consequence if a subprogram body, typically of an expression function, is placed just after a freeze node, its early call region depends on whether the construct just before the freeze node can be preelaborated or not; in other words, the legality of calls made from the actions of this freeze node to the subprogram depends on what happens ahead of the freeze node, which may be totally unrelated to the situation. This change disables the ABE diagnostics in this case, as is done in a few other similar cases leading to bogus errors too. gcc/ada/ * sem_elab.adb (Processing_In_State): Add Within_Freezing_Actions component. (Process_Conditional_ABE_Call): Compute its value. (Process_Conditional_ABE_Call_SPARK): For a call and a target in the main unit, do not emit any ABE diagnostics if the call occurs in a freezing actions context.
2022-12-06ada: Elide the copy in extended returns for nonlimited by-reference typesEric Botcazou18-411/+706
This implements elision of the copy operation for extended return statements in the case of nonlimited by-reference types (the copy operation is already elided for limited types by the front-end and nonlimited non-by-reference types by the code generator), which comprise controlled and tagged types. The implementation partly reuses the machinery implemented for limited types (the build-in-place machinery) to allocate the return object directly on the primary or the secondary stack, depending on whether the result type of the function is constrained or not. This requires further special-casing for the allocators generated by this machinery as well as an adjustment to the implementation of a specific case of string concatenation. gcc/ada/ * einfo.ads (Actual_Subtype): Document additional usage. * exp_aggr.adb (Expand_Array_Aggregate): Replace test on Is_Build_In_Place_Return_Object with Is_Special_Return_Object. * exp_ch3.adb (Expand_N_Object_Declaration): Factor out parts of the processing done for build-in-place return objects and reuse them to implement a similar processing for specific return objects. * exp_ch4.adb (Expand_Allocator_Expression): Do not generate a tag assignment or an adjustment if the allocator was made for a special return object. (Expand_Concatenate): If the result is allocated on the secondary stack, use an unconstrained allocation. * exp_ch6.ads (Apply_CW_Accessibility_Check): New declaration. (Is_By_Reference_Return_Object): Likewise. (Is_Secondary_Stack_Return_Object): Likewise. (Is_Special_Return_Object): Likewise. * exp_ch6.adb (Expand_Ctrl_Function_Call): Do not bail out for the expression in the declaration of a special return object. (Expand_N_Extended_Return_Statement): Add missing guard and move the class-wide accessibility check to Expand_N_Object_Declaration. (Expand_Simple_Function_Return): Delete obsolete commentary. Skip the special processing for types that require finalization or are returned on the secondary stack if the return originally comes from an extended return statement. Add missing Constant_Present. (Is_By_Reference_Return_Object): New predicate. (Is_Secondary_Stack_Return_Object): Likewise. (Is_Special_Return_Object): Likewise. * exp_util.adb (Is_Related_To_Func_Return): Also return true if the parent of the expression is the renaming declaration generated for the expansion of a return object. * gen_il-fields.ads (Opt_Field_Enum): Replace Alloc_For_BIP_Return with For_Special_Return_Object. * gen_il-gen-gen_nodes.adb (N_Allocator): Likewise. * gen_il-internals.adb (Image): Remove Alloc_For_BIP_Return. * sem_ch3.adb (Check_Return_Subtype_Indication): New procedure moved from sem_ch6.adb. (Analyze_Object_Declaration): Call it on a return object. * sem_ch4.adb: Add with and use clauses for Rtsfind. (Analyze_Allocator): Test For_Special_Return_Object to skip checks for allocators made for special return objects. Do not report restriction violations for the return stack pool. * sem_ch5.adb (Analyze_Assignment.Set_Assignment_Type): Return the Actual_Subtype for return objects that live on the secondary stack. * sem_ch6.adb (Check_Return_Subtype_Indication): Move procedure to sem_ch3.adb. (Analyze_Function_Return): Do not call above procedure. * sem_res.adb (Resolve_Allocator): Replace Alloc_For_BIP_Return with For_Special_Return_Object. * sinfo.ads: Likewise. * treepr.adb (Image): Remove Alloc_For_BIP_Return. * gcc-interface/trans.cc (gnat_to_gnu): Do not convert to the result type in the unconstrained array type case if the parent is a simple return statement.
2022-12-06ada: Small adjustment to special resolution of membership testEric Botcazou1-7/+11
It's needed because, in GNAT, universal_integer does not cover all the values of all the supported integer types. gcc/ada/ * sem_res.adb (Resolve_Membership_Op): Adjust latest change.
2022-12-06ada: Use larger type for membership test of universal valueEric Botcazou2-33/+106
When a membership test is applied to a nonstatic expression of a universal type, for example an attribute whose type is universal_integer and whose prefix is not static, the operation is performed using the tested type that is determined by the choice list. In particular, a check that the value of the expression lies in the range of the tested type may be generated before the test is actually performed. This goes against the spirit of membership tests, which are typically used to guard a specific operation and ought not to fail a check in doing so. Therefore the resolution of the operands of membership tests is changed in this case to use the universal type instead of the tested type. The final computation of the type used to actually perform the test is left to the expander, which already has the appropriate circuitry. This nevertheless requires fixing an irregularity in the expansion of the subtype_mark form of membership tests, which was dependent on the presence of predicates for the subtype; the confusing name of a routine used by this expansion is also changed in the process. gcc/ada/ * exp_ch4.adb (Expand_N_In) <Substitute_Valid_Check>: Rename to... <Substitute_Valid_Test>: ...this. Use Is_Entity_Name to test for the presence of entity references. Do not warn or substitute a valid test for a test with a mark for a subtype that is predicated. Apply the same transformation for a test with a mark for a subtype that is predicated as for a subtype that is not. Remove useless return statement. * sem_res.adb (Resolve_Membership_Op): Perform a special resolution if the left operand is of a universal numeric type.
2022-12-06ada: Accessibility code reorganization and bug fixesJustin Squirek27-2414/+2577
This patch performs a large reorganization of accessibility related sources, and also corrects some latent issues with accessibility checks - namely the calculation of accessibility levels for expanded iterators and type conversions. gcc/ada/ * accessibility.adb, accessibility.ads (Accessibility_Message): Moved from sem_attr. (Apply_Accessibility_Check): Moved from checks. (Apply_Accessibility_Check_For_Allocator): Moved from exp_ch4 and renamed (Check_Return_Construct_Accessibility): Moved from sem_ch6. (Innermost_Master_Scope_Depth): Moved from sem_util. Add condition to detect expanded iterators. (Prefix_With_Safe_Accessibility_Level): Moved from sem_attr. (Static_Accessibility_Level): Moved from sem_util. (Has_Unconstrained_Access_Discriminants): Likewise. (Has_Anonymous_Access_Discriminant): Likewise. (Is_Anonymous_Access_Actual): Likewise. (Is_Special_Aliased_Formal_Access): Likewise. (Needs_Result_Accessibility_Level): Likewise. (Subprogram_Access_Level): Likewise. (Type_Access_Level): Likewise. (Deepest_Type_Access_Level): Likewise. (Effective_Extra_Accessibility): Likewise. (Get_Dynamic_Accessibility): Likewise. (Has_Access_Values): Likewise. (Accessibility_Level): Likewise. * exp_attr.adb (Access_Cases): Obtain the proper enclosing object which applies to a given 'Access by looking through type conversions. * exp_ch4.adb (Apply_Accessibility_Check): Moved to accessibility. * exp_ch5.adb: Likewise. * exp_ch6.adb: Likewise. * exp_ch9.adb: Likewise. * exp_disp.adb: Likewise. * gen_il-fields.ads: Add new flag Comes_From_Iterator. * gen_il-gen-gen_nodes.adb: Add new flag Comes_From_Iterator for N_Object_Renaming_Declaration. * sem_ch5.adb (Analyze_Iterator_Specification): Mark object renamings resulting from iterator expansion with the new flag Comes_From_Iterator. * sem_aggr.adb (Resolve_Container_Aggregate): Refine test. * sem_ch13.adb: Add dependence on the accessibility package. * sem_ch3.adb: Likewise. * sem_ch4.adb: Likewise. * sem_ch9.adb: Likewise. * sem_res.adb: Likewise. * sem_warn.adb: Likewise. * exp_ch3.adb: Likewise. * sem_attr.adb (Accessibility_Message): Moved to accessibility. (Prefix_With_Safe_Accessibility_Level): Likewise. * checks.adb, checks.ads (Apply_Accessibility_Check): Likewise. * sem_ch6.adb (Check_Return_Construct_Accessibility): Likewise. * sem_util.adb, sem_util.ads (Accessibility_Level): Likewise. (Deepest_Type_Access_Level): Likewise. (Effective_Extra_Accessibility): Likewise. (Get_Dynamic_Accessibility): Likewise. (Has_Access_Values): Likewise. (Has_Anonymous_Access_Discriminant): Likewise. (Static_Accessibility_Level): Likewise. (Has_Unconstrained_Access_Discriminants): Likewise. (Is_Anonymous_Access_Actual): Likewise. (Is_Special_Aliased_Formal_Access): Likewise. (Needs_Result_Accessibility_Level): Likewise. (Subprogram_Access_Level): Likewise. (Type_Access_Level): Likewise. * sinfo.ads: Document new flag Comes_From_Iterator. * gcc-interface/Make-lang.in: Add entry for new Accessibility package.
2022-12-06ada: Add Codepeer Exemption + simplify TO_C code.Liaiss Merzougue1-9/+6
This patch simplify the TO_C code to have a single branch for raising exception. Furthermore, adding pragma annotate for codepeer to ignore uninitialized value since this is caused because we have input check before the initialization. gcc/ada/ * libgnat/i-c.adb (To_C): Simplify code for having a single exception raise. Add pragma annotate about uninitialized value which happen only on exception raising.
2022-12-06arm: Fix MVE's vcmp vector-scalar patterns [PR107987]Andre Vieira2-4/+17
This patch surrounds the scalar operand of the MVE vcmp patterns with a vec_duplicate to ensure both operands of the comparision operator have the same (vector) mode. gcc/ChangeLog: PR target/107987 * config/arm/mve.md (mve_vcmp<mve_cmp_op>q_n_<mode>, @mve_vcmp<mve_cmp_op>q_n_f<mode>): Apply vec_duplicate to scalar operand. gcc/testsuite/ChangeLog: * gcc.target/arm/mve/pr107987.c: New test.
2022-12-06i386: Fix up expander conditions on cbranchbf4 and cstorebf4 [PR107969]Jakub Jelinek2-2/+14
With -msoft-float we ICE on __bf16 comparisons, because the insns we want to use under the hood (cbranchsf4 and cstoresf4) after performing the fast extensions aren't available. The following patch copies the conditions from the c*sf4 expanders to the corresponding c*bf4 expanders. 2022-12-06 Jakub Jelinek <jakub@redhat.com> PR target/107969 * config/i386/i386.md (cbranchbf4, cstorebf4): Guard expanders with the same condition as cbranchsf4 or cstoresf4 expanders. * gcc.target/i386/pr107969.c: New test.
2022-12-06testsuite: Use -mnofpu for rx-*-* in ieee testsuite [PR107046]Jakub Jelinek1-0/+3
add_options_for_ieee has: if { [istarget alpha*-*-*] || [istarget sh*-*-*] } { return "$flags -mieee" } if { [istarget rx-*-*] } { return "$flags -mnofpu" } but ieee.exp doesn't use add_options_for_ieee, instead it has: if { [istarget "alpha*-*-*"] || [istarget "sh*-*-*"] } then { lappend additional_flags "-mieee" } among other things (plus -ffloat-store on some arches etc.). The following patch adds the rx -mnofpu similarly in the hope of fixing ieee.exp FAILs on rx. Preapproved in the PR by Jeff, committed to trunk. 2022-12-06 Jakub Jelinek <jakub@redhat.com> PR testsuite/107046 * gcc.c-torture/execute/ieee/ieee.exp: For rx-*-* append -mnofpu.
2022-12-06tree-optimization/104475 - improve access diagnosticsRichard Biener2-5/+20
When we end up isolating a nullptr path it happens we diagnose accesses to offsetted nullptr objects. The current diagnostics have no good indication that this happens so the following records the fact that our heuristic detected a nullptr based access in the access_ref structure and sets up diagnostics to inform of that detail. The diagnostic itself could probably be improved here but its API is twisted and the necessary object isn't passed around. Instead of just ...bits/atomic_base.h:655:34: warning: 'unsigned int __atomic_fetch_and_4(volatile void*, unsigned int, int)' writing 4 bytes into a region of size 0 overflows the destination [-Wstringop-overflow=] we now add In member function 'void QFutureInterfaceBase::setThrottled(bool)': cc1plus: note: destination object is likely at address zero PR tree-optimization/104475 * pointer-query.h (access_ref::ref_nullptr_p): New flag. * pointer-query.cc (access_ref::access_ref): Initialize ref_nullptr_p. (compute_objsize_r): Set ref_nullptr_p if we treat it that way. (access_ref::inform_access): If ref was treated as nullptr based, indicate that.
2022-12-06range-op-float: Improve binary reverse operationsJakub Jelinek1-4/+29
On Mon, Dec 05, 2022 at 02:29:36PM +0100, Aldy Hernandez wrote: > > So like this for multiplication op1/2_range if it passes bootstrap/regtest? > > For division I'll need to go to a drawing board... > > Sure, looks good to me. Ulrich just filed PR107972, so in the light of that PR the following patch attempts to do that differently. As for testcase, I've tried both attached testcases, but unfortunately it seems that in neither of the cases we actually figure out that res range is finite (or for last function non-zero ordered). So there is further work needed on that. 2022-12-06 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/107972 * range-op-float.cc (frange_drop_infs): New function. (float_binary_op_range_finish): Add DIV_OP2 argument. If DIV_OP2 is false and lhs is finite or if DIV_OP2 is true and lhs is non-zero and not NAN, r must be finite too. (foperator_div::op2_range): Pass true to DIV_OP2 of float_binary_op_range_finish.
2022-12-06range-op-float: Fix up ICE in lower_bound [PR107975]Jakub Jelinek2-0/+21
According to https://gcc.gnu.org/pipermail/gcc-regression/2022-December/077258.html my patch caused some ICEs, e.g. the following testcase ICEs. The problem is that lower_bound and upper_bound methods on a france assert that the range isn't VR_NAN or VR_UNDEFINED. All the op1_range/op2_range methods already return early if lhs.undefined_p, but the other cases (when lhs is VR_NAN or the other opN is VR_NAN or VR_UNDEFINED) aren't. float_binary_op_range_finish will DTRT for those cases already. 2022-12-06 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/107975 * range-op-float.cc (foperator_mult::op1_range, foperator_div::op1_range, foperator_div::op2_range): Just return float_binary_op_range_finish result if lhs is known NAN, or the other operand is known NAN or UNDEFINED. * gcc.dg/pr107975.c: New test.
2022-12-06libgomp.texi: Fix a OpenMP 5.2 and a TR11 impl-status itemTobias Burnus1-1/+2
libgomp/ * libgomp.texi (OpenMP 5.2): Add missing 'the'. (TR11): Add missing '@tab N @tab'.
2022-12-06tree-optimization/104165 - bougs -Warray-bounds, add testcaseRichard Biener1-0/+27
The following adds the testcase from the description which was fixed by r13-2894-gbe4a6551ed37c1. PR tree-optimization/104165 * g++.dg/warn/Warray-bounds-pr104165-1.C: New testcase.
2022-12-06testsuite, X86, Darwin: Fix bf16 ABI tests for Mach-O/MacOS ABI.Iain Sandoe9-15/+340
These tests have failed since introduction since they assume that the assembler output is ELF and that the ABI targeted supports the addressing. For Darwin, Mach-O and ABI we need to make several changes: 1. Use the __USER_LABEL__PREFIX__ 2. Remove the use of ELF-specific constructs (.size, .type etc.) 3. We cannot make direct access to common variables in the ABI, so that we must move these to BSS. These changes are made in darwin-specific asm files. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> gcc/testsuite/ChangeLog: * gcc.target/x86_64/abi/bf16/abi-bf16.exp: Use separate asm for Darwin. * gcc.target/x86_64/abi/bf16/m256bf16/abi-bf16-ymm.exp: Likewise. * gcc.target/x86_64/abi/bf16/m512bf16/abi-bf16-zmm.exp: Likewise. * gcc.target/x86_64/abi/bf16/args.h: Make xmm_regs, x87_regs extern. * gcc.target/x86_64/abi/bf16/m256bf16/args.h: Likewise. * gcc.target/x86_64/abi/bf16/m512bf16/args.h: Likewise. * gcc.target/x86_64/abi/bf16/asm-support-darwin.S: New file. * gcc.target/x86_64/abi/bf16/m256bf16/asm-support-darwin.S: New file. * gcc.target/x86_64/abi/bf16/m512bf16/asm-support-darwin.S: New file.
2022-12-06aarch64: Use dup and zip1 for interleaving elements in vector initializer.Prathamesh Kulkarni2-0/+69
gcc/ChangeLog: * config/aarch64/aarch64.cc (aarch64_expand_vector_init): Use dup and zip1 for interleaving elements in vector initializer. gcc/testsuite/ChangeLog: * gcc.target/aarch64/interleave-init-1.c: New test.
2022-12-06Daily bump.GCC Administrator4-1/+105
2022-12-05middle-end/40635 - SSA update losing PHI arg loationsRichard Biener2-4/+40
The following fixes an issue where SSA update loses PHI argument locations when updating PHI nodes it didn't create as part of the SSA update. For the case where the reaching def is the same as the current argument opt to do nothing and for the case where the PHI argument already has a location keep that (that's an indication the PHI node wasn't created as part of the update SSA process). PR middle-end/40635 * tree-into-ssa.cc (rewrite_update_phi_arguments): Only update the argument when the reaching definition is different from the current argument. Keep an existing argument location. * gcc.dg/uninit-pr40635.c: New testcase.
2022-12-05tree-optimization/106868 - bogus -Wdangling-pointer diagnosticRichard Biener2-36/+30
The testcase shows we mishandle the case where there's a pass-through of a pointer through a function like memcpy. The following adjusts handling of this copy case to require a taken address and adjust the PHI case similarly. PR tree-optimization/106868 * gimple-ssa-warn-access.cc (pass_waccess::gimple_call_return_arg_ref): Inline into single user ... (pass_waccess::check_dangling_uses): ... here and adjust the call and the PHI case to require that ref.aref is the address of the decl. * gcc.dg/Wdangling-pointer-pr106868.c: New testcase.
2022-12-05match.pd: Don't fold nan < x etc. for -ftrapping-math [PR106805]Jakub Jelinek6-4/+101
As reported in the PR, the following pr106805.c testcase is miscompiled with the default -ftrapping-math, because we fold all the comparisons into constants and don't raise any exceptions. The match.pd pattern handles just simple comparisons, from those EQ/NE are quiet and don't raise exceptions on anything but sNaN, while GT/GE/LT/LE are signaling and do raise exceptions even on qNaN. fold_relational_const handles this IMHO correctly: /* Handle the cases where either operand is a NaN. */ if (real_isnan (c0) || real_isnan (c1)) { switch (code) { case EQ_EXPR: case ORDERED_EXPR: result = 0; break; case NE_EXPR: case UNORDERED_EXPR: case UNLT_EXPR: case UNLE_EXPR: case UNGT_EXPR: case UNGE_EXPR: case UNEQ_EXPR: result = 1; break; case LT_EXPR: case LE_EXPR: case GT_EXPR: case GE_EXPR: case LTGT_EXPR: if (flag_trapping_math) return NULL_TREE; result = 0; break; default: gcc_unreachable (); } return constant_boolean_node (result, type); } by folding the signaling comparisons only if -fno-trapping-math. The following patch does the same in match.pd. Unfortunately the pr106805.c testcase still fails, but no longer because of match.pd, but on the trunk because of the still unresolved ranger problems (same issue as for fold-overflow-1.c etc.) and on 12 branch (and presumably trunk too) somewhere during expansion the comparisons are also expanded into constants (which is ok for -fno-trapping-math, but not ok with that). Though, I think the patch is a small step in the direction, so I'd like to commit this patch without the gcc.dg/pr106805.c testcase for now. 2022-12-05 Jakub Jelinek <jakub@redhat.com> PR middle-end/106805 * match.pd (cmp @0 REAL_CST@1): Don't optimize x cmp NaN or NaN cmp x to false/true for cmp >/>=/</<= if -ftrapping-math. * c-c++-common/pr57371-4.c: Revert 2021-09-19 changes. * c-c++-common/pr57371-5.c: New test. * gcc.c-torture/execute/ieee/fp-cmp-6.x: Add -fno-trapping-math. * gcc.c-torture/execute/ieee/fp-cmp-9.c: New test. * gcc.c-torture/execute/ieee/fp-cmp-9.x: New file.
2022-12-05range-op-float: Fix up multiplication and division reverse operation [PR107879]Jakub Jelinek2-8/+91
While for the normal cases it seems to be correct to implement reverse multiplication (op1_range/op2_range) through division with float_binary_op_range_finish, reverse division (op1_range) through multiplication with float_binary_op_range_finish or (op2_range) through division with float_binary_op_range_finish, as e.g. following testcase shows for the corner cases it is incorrect. Say on the testcase we are doing reverse multiplication, we have [-0., 0.] range (no NAN) on lhs and VARYING on op1 (or op2). We implement that through division, because x from lhs = x * op2 is x = lhs / op2 For the division, [-0., 0.] / VARYING is computed (IMHO correctly) as [-0., 0.] +-NAN, because 0 / anything but 0 or NAN is still 0 and 0 / 0 is NAN and ditto 0 / NAN. And then we just float_binary_op_range_finish, which figures out that because lhs can't be NAN, neither operand can be NAN. So, the end range is [-0., 0.]. But that is not correct for the reverse multiplication. When the result is 0, if op2 can be zero, then x can be anything (VARYING), to be precise anything but INF (unless result can be NAN), because anything * 0 is 0 (or NAN for INF). While if op2 must be non-zero, then x must be 0. Of course the sign logic (signbit(x) = signbit(lhs) ^ signbit(op2)) still holds, so it actually isn't full VARYING if both lhs and op2 have known sign bits. And going through other corner cases one by one shows other differences between what we compute for the corresponding forward operation and what we should compute for the reverse operations. The following patch is slightly conservative and includes INF (in case of result including 0 and not NAN) in the ranges or 0 in the ranges (in case of result including INF and not NAN). The latter is what happens anyway because we flush denormals to 0, and the former just not to deal with all the corner cases. So, the end test is that for reverse multiplication and division op2_range the cases we need to adjust to VARYING or VARYING positive or VARYING negative are if lhs and op? ranges both contain 0, or both contain some infinity, while for division op1_range the corner case is if lhs range contains 0 and op2 range contains INF or vice versa. Otherwise I believe ranges from the corresponding operation are ok, or could be slightly more conservative (e.g. for reverse multiplication, if op? range is singleton INF and lhs range doesn't include any INF, then x's range should be UNDEFINED or known NAN (depending on if lhs can be NAN), while the division computes [-0., 0.] +-NAN; or similarly if op? range is only 0 and lhs range doesn't include 0, division would compute +INF +-NAN, or -INF +-NAN, or (for lack of multipart franges -INF +INF +-NAN just VARYING +-NAN), while again it is UNDEFINED or known NAN. Oh, and I found by code inspection wrong condition for the division's known NAN result, due to thinko it would trigger not just when both operands are known to be 0 or both are known to be INF, but when either both are known to be 0, or at least one is known to be INF. 2022-12-05 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/107879 * range-op-float.cc (foperator_mult::op1_range): If both lhs and op2 ranges contain zero or both ranges contain some infinity, set r range to zero_to_inf_range depending on signbit_known_p. (foperator_div::op2_range): Similarly for lhs and op1 ranges. (foperator_div::op1_range): If lhs range contains zero and op2 range contains some infinity or vice versa, set r range to zero_to_inf_range depending on signbit_known_p. (foperator_div::rv_fold): Fix up condition for returning known NAN.
2022-12-05tree-optimization/107833 - invariant motion of uninit usesRichard Biener7-113/+187
The following fixes a wrong-code bug caused by loop invariant motion hoisting an expression using an uninitialized value outside of its controlling condition causing IVOPTs to use that to rewrite a defined value. PR107839 is a similar case involving a bogus uninit diagnostic. PR tree-optimization/107833 PR tree-optimization/107839 * cfghooks.cc: Include tree.h. * tree-ssa-loop-im.cc (movement_possibility): Wrap and make stmts using any ssa_name_maybe_undef_p operand to preserve execution. (loop_invariant_motion_in_fun): Call mark_ssa_maybe_undefs to init maybe-undefined status. * tree-ssa-loop-ivopts.cc (ssa_name_maybe_undef_p, ssa_name_set_maybe_undef, ssa_name_any_use_dominates_bb_p, mark_ssa_maybe_undefs): Move ... * tree-ssa.cc: ... here. * tree-ssa.h (ssa_name_any_use_dominates_bb_p, mark_ssa_maybe_undefs): Declare. (ssa_name_maybe_undef_p, ssa_name_set_maybe_undef): Define. * gcc.dg/torture/pr107833.c: New testcase. * gcc.dg/uninit-pr107839.c: Likewise.
2022-12-05plugins/107964 - install contracts.hScott Snyder1-1/+1
contracts.h is included by cp-tree.h so needs to be installed for plugins. PR plugins/107964 gcc/cp/ * Make-lang.in (CP_PLUGIN_HEADERS): Install contracts.h
2022-12-05tree-optimization/107956 - ICE with NULL call LHSAndrew Pinski1-0/+2
The following adds a missing check for a NULL call LHS in the vector pattern recognizer. PR tree-optimization/107956 * tree-vect-patterns.cc (vect_recog_mask_conversion_pattern): Check for NULL LHS on masked loads.
2022-12-04gimple-fold: Refine gimple_fold_partial_load_store_mem_ref [PR107412]Kewen Lin1-8/+7
Following Richard's review comments, this patch is to use untruncated type for the length used for IFN_LEN_{LOAD,STORE} instead of "unsigned int" for better robustness. It also avoid to use to_constant and tree arithmetic for subtraction. Co-authored-by: Richard Sandiford <richard.sandiford@arm.com> PR tree-optimization/107412 gcc/ChangeLog: * gimple-fold.cc (gimple_fold_partial_load_store_mem_ref): Use untruncated type for the length, and avoid to_constant and tree arithmetic for subtraction.
2022-12-05Daily bump.GCC Administrator6-1/+80
2022-12-04Fortran: error recovery simplifying UNPACK for insufficient FIELD [PR107922]Harald Anlauf2-1/+25
gcc/fortran/ChangeLog: PR fortran/107922 * simplify.cc (gfc_simplify_unpack): Terminate simplification when array-valued argument FIELD does not provide enough elements. gcc/testsuite/ChangeLog: PR fortran/107922 * gfortran.dg/unpack_field_1.f90: New test.
2022-12-04Fortran: fix typo in documentation of intrinsic FLOOR [PR107870]Harald Anlauf1-30/+30
gcc/fortran/ChangeLog: PR fortran/107870 * intrinsic.texi: Fix typo in documentation of intrinsic FLOOR. Describe the optional KIND argument to intrinsics as a scalar constant expression, in accordance with the current standard.
2022-12-04Fortran: error recovery handling invalid CLASS variable [PR107899]Harald Anlauf2-1/+14
gcc/fortran/ChangeLog: PR fortran/107899 * resolve.cc (resolve_deallocate_expr): Avoid NULL pointer dereference on invalid CLASS variable. gcc/testsuite/ChangeLog: PR fortran/107899 * gfortran.dg/pr107899.f90: New test.
2022-12-04c++: pack in requires-expr parm list [PR107417]Patrick Palka3-24/+22
Here find_parameter_packs_r isn't detecting the pack T inside the requires-expr's parameter list ultimately because cp_walk_trees deliberately avoids walking the list so as to avoid false positives in the unexpanded pack checker. But it should still be fine to walk the TREE_TYPE of each parameter, which we already need to do from for_each_template_parm_r, and is sufficient to fix the testcase. PR c++/107417 gcc/cp/ChangeLog: * pt.cc (for_each_template_parm_r) <case REQUIRES_EXPR>: Move walking of the TREE_TYPE of each parameter to ... * tree.cc (cp_walk_subtrees) <case REQUIRES_EXPR>: ... here. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-requires33.C: New test.
2022-12-04libstdc++, Darwin: Limit recursive mutex init to OS versions needing it.Iain Sandoe1-1/+5
The problem described in pr 51906 was fixed in the next OS release. Limit the workaround to systems that need it. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> libstdc++-v3/ChangeLog: * config/os/bsd/darwin/os_defines.h (_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC): Limit use of this macro to OS versions that need it.
2022-12-04libstdc++, Darwin: Fix weak attribute to use __weak__ instead of weak.Iain Sandoe1-5/+5
The text for _GLIBCXX_WEAK_DEFINITION has used 'weak' for the attribute name, since its intoduction. Amend to use the implementation namespace '__weak__' version. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> libstdc++-v3/ChangeLog: * config/os/bsd/darwin/os_defines.h (_GLIBCXX_WEAK_DEFINITION): Use the implementation namespace for the weak attribute.
2022-12-04libsanitizer, Darwin: Restrict build to Darwin 16 or newer.Iain Sandoe1-1/+1
The latest import has added dependencies on system resources that are not present until Darwin 16. It might be possible to work around these for earlier systems, but in the short-term we have to disable the build so that bootstrap completes. Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> libsanitizer/ChangeLog: * configure.tgt: Restrict build to Darwin 16 or newer.
2022-12-04coroutines: Do not promote temporaries that will be elided.Iain Sandoe6-0/+441
We usually need to 'promote' (i.e. save to the coroutine frame) any temporary variable that is in a target expression that must persist across an await expression. However, if the TE is just used as a direct initializer for another object it will be elided - and we should not promote it since that would lead to a DTOR call for something that is never constructed. Since we now have a mechanism to tell if TEs will be elided, use that. Although the PRs referenced initially appear to be different issues, they all stem from this. Co-Authored-By: Adrian Perl <adrian.perl@web.de> Signed-off-by: Iain Sandoe <iain@sandoe.co.uk> PR c++/100611 PR c++/101367 PR c++/101976 PR c++/99576 gcc/cp/ChangeLog: * coroutines.cc (find_interesting_subtree): Do not promote temporaries that are only used as direct initializers for some other object. gcc/testsuite/ChangeLog: * g++.dg/coroutines/pr100611.C: New test. * g++.dg/coroutines/pr101367.C: New test. * g++.dg/coroutines/pr101976.C: New test. * g++.dg/coroutines/pr99576_1.C: New test. * g++.dg/coroutines/pr99576_2.C: New test.
2022-12-04Daily bump.GCC Administrator3-1/+23
2022-12-03c++: substituting CONST_DECL_USING_P enumerators [PR103081]Patrick Palka3-6/+36
We implement class-scope using enum by injecting clones of the enum's CONST_DECLs as fields of the class, for which CONST_DECL_USING_P is true, so that qualified lookup naturally finds the enumerators. Substitution into such a CONST_DECL currently ICEs however, because we assume the DECL_CONTEXT is always the ENUMERAL_TYPE (which has TYPE_VALUES) but in this case it's the RECORD_TYPE for the class scope (which has TYPE_FIELDS). Since these CONST_DECLs appear to always be non-dependent, this patch fixes this by shortcutting substitution for CONST_DECLs that have non-dependent DECL_CONTEXT. This subsumes the existing (and seemingly dead) DECL_NAMESPACE_SCOPE_P early exit test and also benefits substitution into ordinary non-dependent CONST_DECLs. PR c++/103081 gcc/cp/ChangeLog: * pt.cc (tsubst_copy) <case CONST_DECL>: Generalize early exit test for namespace-scope decls to check dependence of the enclosing scope instead. Remove dead early exit test. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/using-enum-10.C: New test. * g++.dg/cpp2a/using-enum-10a.C: New test.
2022-12-02[testsuite] [riscv] skip ssa-sink-18.cAlexandre Oliva1-2/+5
On riscv64, despite being lp64, we choose two IV candidates as on arm, which prevents some of the expected sinking. Add an xfail for it. for gcc/testsuite/ChangeLog * gcc.dg/tree-ssa/ssa-sink-18.c: xfail sink2 on riscv64.
2022-12-02[testsuite] [riscv] uninit-pred-9_b bogus warningAlexandre Oliva1-1/+1
Like other platforms, riscv hits the uninitialized warning because the optimizations don't eliminate the nonviable path that would enable it to be omitted. for gcc/testsuite/ChangeLog * gcc.dg/uninit-pred-9_b.c: Add riscv*-*-* to the xfail list for the bogus warning.
2022-12-03Daily bump.GCC Administrator6-1/+174
2022-12-02Fortran: intrinsic MERGE shall use all its arguments [PR107874]Harald Anlauf1-7/+15
gcc/testsuite/ChangeLog: PR fortran/107874 * gfortran.dg/merge_1.f90: Avoid recursive I/O.
2022-12-02analyzer: introduce struct event_loc_infoDavid Malcolm15-197/+211
gcc/analyzer/ChangeLog: * analyzer.h (struct event_loc_info): New forward decl. * bounds-checking.cc: Use event_loc_info throughout to bundle the loc, fndecl, depth triples. * call-info.cc: Likewise. * checker-event.cc: Likewise. * checker-event.h (struct event_loc_info): New decl. Use it throughout to bundle the loc, fndecl, depth triples. * checker-path.cc: Likewise. * checker-path.h: Likewise. * diagnostic-manager.cc: Likewise. * engine.cc: Likewise. * infinite-recursion.cc: Likewise. * pending-diagnostic.cc: Likewise. * pending-diagnostic.h: Likewise. * region-model.cc: Likewise. * sm-signal.cc: Likewise. * varargs.cc: Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-12-02analyzer: fixes to region creation messages [PR107851]David Malcolm21-172/+396
In r13-2573-gc81b60b8c6ff3d I split up the analyzer's region-creation events to describe the memory space and capacity of the region as two separate events to avoid combinatorial explosion of message wordings. However I didn't take into account r13-1405-ge6c3bb379f515b which added a pending_diagnostic::describe_region_creation_event vfunc which could change the wording of region creation events. Hence for: #include <stdlib.h> #include <stdint.h> void test () { int32_t *ptr = malloc (1); free (ptr); } trunk currently emits: Compiler Explorer (x86_64 trunk): https://godbolt.org/z/e3Td7c9s5: <source>: In function 'test': <source>:6:18: warning: allocated buffer size is not a multiple of the pointee's size [CWE-131] [-Wanalyzer-allocation-size] 6 | int32_t *ptr = malloc (1); | ^~~~~~~~~~ 'test': events 1-3 | | 6 | int32_t *ptr = malloc (1); | | ^~~~~~~~~~ | | | | | (1) allocated 1 bytes here | | (2) allocated 1 bytes here | | (3) assigned to 'int32_t *' {aka 'int *'} here; 'sizeof (int32_t {aka int})' is '4' | where events (1) and (2) are different region_creation_events that have had their wording overridden (also, with a "1 bytes" issue). This patch reorganizes region creation events so that each pending_diagnostic instead creates the events that is appropriate for it, and the events have responsibility for their own wording. With this patch, the above emits: <source>: In function 'test': <source>:6:18: warning: allocated buffer size is not a multiple of the pointee's size [CWE-131] [-Wanalyzer-allocation-size] 6 | int32_t *ptr = malloc (1); | ^~~~~~~~~~ 'test': events 1-2 | | 6 | int32_t *ptr = malloc (1); | | ^~~~~~~~~~ | | | | | (1) allocated 1 byte here | | (2) assigned to 'int32_t *' {aka 'int *'} here; 'sizeof (int32_t {aka int})' is '4' | fixing the duplicate event, and fixing the singular/plural issue. gcc/analyzer/ChangeLog: PR analyzer/107851 * analyzer.cc (make_label_text_n): Convert param "n" from int to unsigned HOST_WIDE_INT. * analyzer.h (make_label_text_n): Likewise for decl. * bounds-checking.cc: Include "analyzer/checker-event.h" and "analyzer/checker-path.h". (out_of_bounds::add_region_creation_events): New. (concrete_past_the_end::describe_region_creation_event): Replace with... (concrete_past_the_end::add_region_creation_events): ...this. (symbolic_past_the_end::describe_region_creation_event): Delete. * checker-event.cc (region_creation_event::region_creation_event): Update for dropping all member data. (region_creation_event::get_desc): Delete, splitting out into region_creation_event_memory_space::get_desc, region_creation_event_capacity::get_desc, and region_creation_event_debug::get_desc. (region_creation_event_memory_space::get_desc): New. (region_creation_event_capacity::get_desc): New. (region_creation_event_allocation_size::get_desc): New. (region_creation_event_debug::get_desc): New. * checker-event.h: Include "analyzer/program-state.h". (enum rce_kind): Delete. (class region_creation_event): Drop all member data. (region_creation_event::region_creation_event): Make protected. (region_creation_event::get_desc): Delete. (class region_creation_event_memory_space): New. (class region_creation_event_capacity): New. (class region_creation_event_allocation_size): New. (class region_creation_event_debug): New. * checker-path.cc (checker_path::add_region_creation_events): Add "pd" param. Call pending_diangnostic::add_region_creation_events. Update for conversion of RCE_DEBUG to region_creation_event_debug. * checker-path.h (checker_path::add_region_creation_events): Add "pd" param. * diagnostic-manager.cc (diagnostic_manager::build_emission_path): Pass pending_diagnostic to emission_path::add_region_creation_events. (diagnostic_manager::build_emission_path): Pass path_builder to add_event_on_final_node. (diagnostic_manager::add_event_on_final_node): Add "pb" param. Pass pending_diagnostic to emission_path::add_region_creation_events. (diagnostic_manager::add_events_for_eedge): Pass pending_diagnostic to emission_path::add_region_creation_events. * diagnostic-manager.h (diagnostic_manager::add_event_on_final_node): Add "pb" param. * pending-diagnostic.cc (pending_diagnostic::add_region_creation_events): New. * pending-diagnostic.h (struct region_creation): Delete. (pending_diagnostic::describe_region_creation_event): Delete. (pending_diagnostic::add_region_creation_events): New vfunc. * region-model.cc: Include "analyzer/checker-event.h" and "analyzer/checker-path.h". (dubious_allocation_size::dubious_allocation_size): Initialize m_has_allocation_event. (dubious_allocation_size::describe_region_creation_event): Delete. (dubious_allocation_size::describe_final_event): Update for replacement of m_allocation_event with m_has_allocation_event. (dubious_allocation_size::add_region_creation_events): New. (dubious_allocation_size::m_allocation_event): Replace with... (dubious_allocation_size::m_has_allocation_event): ...this. gcc/testsuite/ChangeLog: PR analyzer/107851 * gcc.dg/analyzer/allocation-size-4.c: Update expected wording. * gcc.dg/analyzer/allocation-size-multiline-1.c: New test. * gcc.dg/analyzer/allocation-size-multiline-2.c: New test. * gcc.dg/analyzer/out-of-bounds-multiline-1.c: Update expected wording. * gcc.dg/analyzer/out-of-bounds-multiline-2.c: New test. * gcc.dg/analyzer/out-of-bounds-read-char-arr.c: Update expected wording. * gcc.dg/analyzer/out-of-bounds-read-int-arr.c: Likewise. * gcc.dg/analyzer/out-of-bounds-write-char-arr.c: Likewise. * gcc.dg/analyzer/out-of-bounds-write-int-arr.c: Likewise. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
2022-12-02testsuite: Adjust dg-error for -fimplicit-constexprMarek Polacek4-7/+8
Some of the new tests were failing with -fimplicit-constexpr. This patch adjusts the expected diagnostic. Tested with GXX_TESTSUITE_STDS=98,11,14,17,20,23 make check-c++ RUNTESTFLAGS="--target_board=unix\{,-fimplicit-constexpr\} dg.exp=spaceship-eq3.C" gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-ex1.C: Adjust dg-error. * g++.dg/cpp23/constexpr-nonlit10.C: Adjust dg-warning. * g++.dg/cpp23/constexpr-nonlit11.C: Likewise. * g++.dg/cpp2a/spaceship-eq3.C: Add dg-error.
2022-12-02c++: Set the locus of the function result declBernhard Reutner-Fischer5-12/+53
gcc/cp/ChangeLog: * decl.cc (grokdeclarator): Build RESULT_DECL. (start_preparsed_function): Copy location from template. * semantics.cc (apply_deduced_return_type): Handle arg != current_function_decl. * method.cc (implicitly_declare_fn): Use it. gcc/ChangeLog: * function.cc (init_function_start): Use DECL_RESULT location for -Waggregate-return warning. gcc/testsuite/ChangeLog: * g++.dg/diagnostic/return-type-loc1.C: New test. Co-authored-by: Jason Merrill <jason@redhat.com>
2022-12-02Fix a few incorrect accesses.Andrew MacLeod2-4/+4
This consists of 3 changes which stronger type checking has indicated are incorrect. gcc/ * fold-const.cc (fold_unary_loc): Check TREE_TYPE of node. (tree_invalid_nonnegative_warnv_p): Likewise. gcc/c-family/ * c-attribs.cc (handle_deprecated_attribute): Use type when using TYPE_NAME.
2022-12-02driver: fix validate_switches logicJason Merrill2-3/+8
Under the old logic for validate_switches, once suffix or starred got set, they stayed set for all later switches found in the spec. So for e.g. %{g*:%{%:debug-level-gt(0): Once we see g*, starred is set. Then we see %:, and it sees that as a zero-length switch, which because starred is still set, matches any and all command-line options. So targets that use such a spec accept all options in the driver, while ones that don't reject some, such as the recent -nostdlib++. This patch fixes the inconsistency, so all targets would complain about -nostdlib++, and then sets SKIPOPT for it so they don't. gcc/ChangeLog: * gcc.cc (validate_switches): Reset suffix/starred on loop. gcc/cp/ChangeLog: * g++spec.cc (lang_specific_driver): Set SKIPOPT for nostdlib++.
2022-12-02LRA: Check hard reg availability of pseudo and its subreg for pseudo reloadVladimir N. Makarov2-1/+24
Do not reload subreg pseudo if there are hard regs for subreg mode but there are no hard regs for pseudo mode. PR target/106462 gcc/ChangeLog: * lra-constraints.cc (curr_insn_transform): Check available hard regs for pseudo and its subreg to decide what to reload. gcc/testsuite/ChangeLog: * gcc.target/mips/pr106462.c: New test.