Jakub Jelinek [Wed, 11 Dec 2019 18:44:02 +0000 (19:44 +0100)]
re PR c++/92869 (C++17 wrongly reports aggregate type as not-aggregate (when explicitly defaulted ctors are added))
PR c++/92869
* class.c (finish_struct): For C++17 and earlier, check
type_has_user_provided_or_explicit_constructor rather than
TYPE_HAS_USER_CONSTRUCTOR whether to set CLASSTYPE_NON_AGGREGATE.
Marek Polacek [Wed, 11 Dec 2019 18:40:55 +0000 (18:40 +0000)]
PR c++/92878 - Parenthesized init of aggregates in new-expression.
Ville pointed out that our paren init of aggregates doesn't work for
auto a = new A(1, 2, 3);
and I think it should:
A new-expression that creates an object of type T initializes that object
as follows:
...
-- Otherwise, the new-initializer is interpreted according to the
initialization rules of [dcl.init] for direct-initialization.
so I think it follows that we should perform dcl.init#17.6.2.2.
This doesn't work with new[]; we have:
error ("parenthesized initializer in array new");
* init.c (build_new_1): Handle parenthesized initialization of
aggregates in new-expression.
Jason Merrill [Wed, 11 Dec 2019 16:51:14 +0000 (11:51 -0500)]
PR c++/92105 - decltype(decltype) error cascade.
The primary change here is to do the CPP_DECLTYPE replacement even when we
get an error, so we don't keep trying and giving the same parse error each
time. We also commit to the tentative firewall parse more often, leading to
better diagnostics.
* parser.c (cp_parser_decltype_expr): Don't tentative_firewall here.
(cp_parser_decltype): Do it here. Remember a non-tentative error.
Jason Merrill [Wed, 11 Dec 2019 16:51:09 +0000 (11:51 -0500)]
PR c++/57082 - new X{} and private destructor.
build_new_1 already passes tf_no_cleanup to build_value_init, but in this
testcase we end up calling build_value_init by way of
build_special_member_call, so we need to pass it to that function as well.
* init.c (build_new_1): Also pass tf_no_cleanup to
build_special_member_call.
Lewis Hyatt [Wed, 11 Dec 2019 14:52:31 +0000 (14:52 +0000)]
Adds multibyte awareness to pretty-print.c
2019-12-11 Lewis Hyatt <lhyatt@gmail.com>
PR 91853
* pretty-print.c (pp_quoted_string): Avoid hex-escaping valid
multibyte input. Fix off-by-one-bug printing the last byte before a
hex-escaped output.
(pp_character): Don't apply line wrapping in the middle of multibyte
characters.
(test_utf8): New test.
(pretty_print_c_tests): Call the new test.
Richard Earnshaw [Wed, 11 Dec 2019 11:59:04 +0000 (11:59 +0000)]
arm: Fix an incorrect warning when -mcpu=cortex-a55 is used with -mfloat-abi=soft
When a CPU such as cortex-a55 is used with the soft-float ABI variant,
the compiler is incorrectly issuing a warning about a mismatch between
the architecture (generated internally) and the CPU. This is not
expected or intended.
The problem stems from the fact that we generate (correctly) an
architecture for a soft-float compilation, but then try to compare it
against the one recorded for the CPU. Normally we strip out the
floating point information before doing that comparison, but we
currently only do that for the features that can be affected by the
-mfpu option. For a soft-float environment we also need to strip out
any bits that depend on having floating-point present.
So this patch implements that and does a bit of housekeeping at the
same time:
- in arm-cpus.in it is not necessary for a CPU to specify both
+dotprod and +simd in its architecture specification, since +dotprod
implies +simd.
- I've refactored the ALL_SIMD fgroup in arm-cpus.in to create a new
subgroup ALL_SIMD_EXTERNAL and containing the bits that were
previously added directly to ALL_SIMD. Similarly, I've added an
ALL_FPU_EXTERNAL subgroup.
- in arm.c rename fpu_bitlist and all_fpubits to fpu_bitlist_internal
and all_fpubits_internal for consistency with the fgroup bits which
they contain.
* config/arm/arm-cpus.in (ALL_SIMD_EXTERNAL): New fgroup.
(ALL_SIMD): Use it.
(ALL_FPU_EXTERNAL): New fgroup.
(ALL_FP): Use it.
(cortex-a55, cortex-a75, cortex-a76, cortex-a76ae): Remove redundant
+simd from architecture specification.
(cortex-a77, neoverse-n1, cortex-a75.cortex-a55): Likewise.
* config/arm/arm.c (isa_all_fpubits, fpu_bitlist): Rename to ...
(isa_all_fpubits_internal, fpu_bitlist_internal): ... these.
(isa_all_fpbits): New bitmap.
(arm_option_override): Initialize it.
(arm_configure_build_target): If the target isa does not have any
FP enabled, do not warn about mismatches in FP-related feature bits.
Ian Lance Taylor [Wed, 11 Dec 2019 00:15:53 +0000 (00:15 +0000)]
compiler: generate type descriptor for pointer to alias defined in another package
When a type descriptor is needed (for e.g. interface conversion),
if the type is a pointer to a named type defined in another
package, we don't generate the definition of the type descriptor
because it is generated in the package where the type is defined.
However, if the named type is an alias to an unnamed type, its
descriptor is not generated in the other package, and we need to
generate it.
Jonathan Wakely [Tue, 10 Dec 2019 23:50:26 +0000 (23:50 +0000)]
libstdc++: Correct noexcept-specifiers on span constructors
As discussed at https://github.com/cplusplus/draft/issues/3534 two
std::span constructors specify incorrect conditions for throwing
exceptions. This patch makes those constructors have correct
noexcept-specifiers that accurately reflect what can actually throw.
(span(ContiguousIterator, Sentinel)): Add conditional noexcept.
* include/std/span (span(ContiguousIterator, size_type)): Change
noexcept to be unconditionally true.
* testsuite/23_containers/span/nothrow_cons.cc: New test.
Vladimir Makarov [Tue, 10 Dec 2019 22:07:57 +0000 (22:07 +0000)]
re PR rtl-optimization/92796 (ICE in lra_assign, at lra-assigns.c:1646 on powerpc64le-linux-gnu)
2019-12-10 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/92796
* lra-int.h (lra_risky_transformations_p): Rename to
check_and_force_assignment_correctness_p.
* lra-assigns.c: Ditto.
(lra_assign): Reset check_and_force_assignment_correctness_p.
* lra-constraints.c (lra_risky_transformations_p): Rename to
check_and_force_assignment_correctness_p.
(lra_constraints): Set up check_and_force_assignment_correctness_p
only for the 1st sub-pass.
* lra-eliminations.c (process_insn_for_elimination): Set up
check_and_force_assignment_correctness_p if the insn chnaged its
code.
2019-12-10 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/92796
* gcc.target/powerpc/pr92796.c: New test.
Enhance those algos overloads to generalize existing optimization for
__gnu_debug::_Safe_iterator w/o _GLIBCXX_DEBUG mode and for std::deque
iterators.
Also extend __copy_move_a2 ostreambuf_iterator overloads to std::vector and
std::deque iterators.
Jakub Jelinek [Tue, 10 Dec 2019 21:05:59 +0000 (22:05 +0100)]
re PR rtl-optimization/92882 (ICE in regstat_bb_compute_calls_crossed, at regstat.c:327 since r279124)
PR rtl-optimization/92882
* regstat.c (regstat_bb_compute_calls_crossed): Don't check
INSN_UID against DF_INSN_SIZE or use DF_INSN_INFO_GET unless
NONDEBUG_INSN_P.
Jakub Jelinek [Tue, 10 Dec 2019 21:04:08 +0000 (22:04 +0100)]
re PR middle-end/92825 (Unnecesary stack protection in Firefox's LightPixel.)
PR middle-end/92825
* cfgexpand.c (add_stack_protection_conflicts): Change return type
from void to bool, return true if at least one stack_vars[i].decl
is addressable.
(record_or_union_type_has_array_p, stack_protect_decl_p): Remove.
(expand_used_vars): Don't call stack_protect_decl_p, instead for
-fstack-protector-strong set gen_stack_protect_signal to true
if add_stack_protection_conflicts returned true. Formatting fixes.
* doc/invoke.texi (-fstack-protector-strong): Clarify that optimized
out variables or variables not living on the stack don't count.
(-fstack-protector): Likewise. Clarify it affects >= 8 byte arrays
rather than > 8 byte.
Jason Merrill [Tue, 10 Dec 2019 20:12:50 +0000 (15:12 -0500)]
PR c++/92847 - C++20 comparison ambiguity with class template.
This testcase demonstrates that looking at cand->template_decl is not a good
starting place for finding the most general template, as it is only set for
primary templates.
* call.c (cand_parms_match): Handle all templated functions.
Jason Merrill [Tue, 10 Dec 2019 20:10:59 +0000 (15:10 -0500)]
Fix C++20 structural type vs. private base.
In my patch to implement C++20 "structural type" I tried to set the access
flags on the artificial base fields appropriately, but failed. I was
copying TREE_PRIVATE from the binfo, but TREE_PRIVATE on binfo is just a
temporary cache for dfs_access_in_type; we really need to get the
inheritance access information from BINFO_BASE_ACCESSES.
* class.c (build_base_field_1): Take access parameter.
(build_base_field): Likewise.
(build_base_fields, layout_virtual_bases): Pass it.
* tree.c (structural_type_p): Improve private base diagnostic.
Jason Merrill [Tue, 10 Dec 2019 20:06:58 +0000 (15:06 -0500)]
PR c++/92560 - ICE with decltype and rewritten operator.
A call as the immediate operand of decltype is handled differently; we don't
create an object of the return type as we do normally. But in the case of a
rewritten operator, we're adding another call as a wrapper, so the inner
call doesn't get the special handling.
* call.c (build_new_op_1): Clear tf_decltype on inner call.
* cgraph.c (cgraph_node::verify_node): Verify tp_first_run.
* cgraph.h (cgrpah_node): Turn tp_first_run back to int.
* cgraphunit.c (tp_first_run_node_cmp): Do not watch for overflows.
(expand_all_functions): First expand ordered section and then
unordered.
* profile.c (compute_value_histograms): Error on out of range
tp_first_runs.
Jan Hubicka [Tue, 10 Dec 2019 17:54:41 +0000 (17:54 +0000)]
Turn tp_first_run counts back to 32bit values.
* cgraph.c (cgraph_node::verify_node): Verify tp_first_run.
* cgraph.h (cgrpah_node): Turn tp_first_run back to int.
* cgraphunit.c (tp_first_run_node_cmp): Do not watch for overflows.
(expand_all_functions): First expand ordered section and then
unordered.
* lto-partition.c (lto_balanced_map): Fix printing of tp_first_run.
* profile.c (compute_value_histograms): Error on out of range
tp_first_runs.
With -msve-vector-bits=N, the payload of some partial SVE modes can
be 16 bytes or smaller, which makes them small enough to fit in a
pair of GPRs. We specifically don't want that, because the payload
is distributed evenly across the SVE register rather than collected
at one end. Marshalling it into a GPR via register operations would
be expensive.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* config/aarch64/aarch64.c (aarch64_hard_regno_mode_ok): Don't
allow SVE modes in GPRs.
gcc/testsuite/
* gcc.target/aarch64/sve/mixed_size_7.c: New test.
[AArch64] Fix INDEX patterns for partial VNx2 modes
The INDEX patterns handle partial modes by choosing the container
size rather than the element size, so that the number of lanes
(and thus number of additions) matches the mode. This means that
all VNx4 modes use .s and all VNx2 modes use .d, etc.
When adding this, I'd forgotten that the choice between Wn and Xn
registers would need to be updated to use the container size too.
For partial VNx2s, we were using .d containers with Wn rather than
Xn source registers.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* config/aarch64/iterators.md (vccore): New iterator.
* config/aarch64/aarch64-sve.md (vec_series<mode>): Use it instead
of vwcore.
(*vec_series<mode>_plus): Likewise.
gcc/testsuite/
* gcc.target/aarch64/sve/mixed_size_6.c: New test.
Jonathan Wakely [Tue, 10 Dec 2019 16:15:49 +0000 (16:15 +0000)]
libstdc++: Fix bug in std::indirect_result_t
The alias template wasn't working because it applied iter_reference_t to
the pack of iterators before and after passing the pack to the
__indeirect_result helper.
* include/bits/iterator_concepts.h (indirect_result_t): Do not apply
iter_reference_t to parameter pack.
* testsuite/24_iterators/indirect_callable/projected.cc: New test.
Frederik Harwath [Tue, 10 Dec 2019 16:12:58 +0000 (16:12 +0000)]
Add tests to verify OpenACC clause locations
Check that the column information for OpenACC clauses is communicated correctly
to the middle-end, in particular by the Fortran front-end (cf. PR 92793).
2019-12-10 Frederik Harwath <frederik@codesourcery.com>
gcc/testsuite/
* c-c++-common/goacc/clause-locations.c: New test.
* gfortran.dg/goacc/clause-locations.f90: New test.
Frederik Harwath [Tue, 10 Dec 2019 16:06:12 +0000 (16:06 +0000)]
Use clause locations in OpenACC nested reduction warnings
Since the Fortran front-end now sets the clause locations correctly, we can
emit warnings with more precise locations if we encounter conflicting
operations for a variable in reduction clauses.
2019-12-10 Frederik Harwath <frederik@codesourcery.com>
gcc/
* omp-low.c (scan_omp_for): Use clause location in warning.
The dwarf2 handling of vector constants currently divides the vector
into a length (number of elements) and byte element size. This doesn't
work well for MODE_VECTOR_BOOL, where several elements are packed into
the same byte.
We should probably add a way of encoding this in future, but for now
the safest thing is to punt, like we already do for variable-length
vectors.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* dwarf2out.c (loc_descriptor): Punt for MODE_VECTOR_BOOL.
(add_const_value_attribute): Likewise.
gcc/testsuite/
* gcc.target/aarch64/sve/acle/general/debug_4.c: New test.
Add missing conversion in vect_create_epilog_for_reduction
The direct_slp_reduc code in vect_create_epilog_for_reduction was
still assuming that all types involved in a reduction are the same
(up to types_compatible_p), whereas we now support differences in
sign. This was causing an ICE in gcc.dg/vect/pr92324-4.c for SVE.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-loop.c (vect_create_epilog_for_reduction): When
handling direct_slp_reduc, allow the PHI arguments to have
a different type from the vector elements.
Record the loop masks needed for EXTRACT_LAST_REDUCTIONs
The analysis phase of vectorizable_condition wasn't recording the
loop masks needed by the transform phase. This meant that the masks
wouldn't be created in the (rare) case that no other statement needed
them.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-stmts.c (vectorizable_condition): Record the loop
masks required for extract-last reductions.
gcc/testsuite/
* gcc.target/aarch64/sve/clastb_9.c: New test.
Fix EXTRACT_LAST_REDUCTION handling of pattern stmts
Unlike most vector ops, extract-last reductions replace the original
scalar code in-situ rather than adding an adjacent vector implementation.
I.e.:
dest_1 = COND_EXPR <...>;
becomes:
dest_1 = .EXTRACT_LAST (...);
gcc.dg/vect/vect-cond-reduc-4.c was ICEing for SVE because we tried
to replace the pattern statement in this way, rather than replacing
the original scalar statement.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-stmts.c (vect_finish_replace_stmt): Always use the
original scalar statement rather than a pattern statement.
(vectorizable_condition): Likewise, in the handling of extract-last
reductions.
Disallow EXTRACT_LAST_REDUCTION for reduction chains
gcc.dg/vect/vect-cond-reduc-5.c was ICEing for SVE because we
tried to use an extract-last reduction for a chain of COND_EXPRs.
Adding support for the chained case would be too invasive for stage 3
so this patch explicitly forbids it instead. I've filed PR92884 for
the possible future work.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-loop.c (vectorizable_reduction): Don't use
EXTRACT_LAST_REDUCTION for chained reductions.
Make get_odr_name_for_type check for TYPE_DECL in the way that
its caller warn_types_mismatch previously did.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* ipa-utils.h (get_odr_name_for_type): Check for a TYPE_DECL.
* ipa-devirt.c (warn_types_mismatch): Don't call xstrdup for the
second demangled name.
gcc/testsuite/
* gcc.dg/lto/tag-1_0.c, gcc.dg/lto/tag-1_1.c: New test.
Martin Liska [Tue, 10 Dec 2019 08:36:56 +0000 (09:36 +0100)]
Fix typos in 2 functions.
2019-12-10 Martin Liska <mliska@suse.cz>
PR tree-optimization/92862
* predict.c (predict_paths_leading_to_edge): Fix typo from e to e2.
* tree-ssa-loop-niter.c (loop_only_exit_p): Return false
instead of true;
* dwarf.c (struct pcrange): Define.
(update_pcrange, add_ranges): New static functions.
(add_unit_addr): Change signature to work with add_ranges. Don't
add base_address here.
(add_unit_ranges): Remove.
(find_address_ranges): Replace str/ranges parameters with
dwarf_sections. Use update_pcrange and add_ranges. Change all
callers.
(add_function_range): Change signature to work with add_ranges.
Don't add base_address here.
(add_function_ranges): Remove.
(read_function_entry): Use update_pcrange and add_ranges.
David Malcolm [Tue, 10 Dec 2019 02:02:38 +0000 (02:02 +0000)]
Replace label_text ctor with "borrow" and "take"
libcpp's label_text class wraps a text buffer, along with a flag to
determine if it "owns" the buffer.
The existing ctor exposed this directly, but I found it difficult
to remember the sense of flag, so this patch hides the ctor, in
favor of static member functions "borrow" and "take", to make
the effect on ownership explicit in the name.
gcc/c-family/ChangeLog:
* c-format.c (range_label_for_format_type_mismatch::get_text):
Replace label_text ctor called with true with label_text::take.
Lewis Hyatt [Mon, 9 Dec 2019 20:03:47 +0000 (20:03 +0000)]
Byte vs column awareness for diagnostic-show-locus.c (PR 49973)
contrib/ChangeLog
2019-12-09 Lewis Hyatt <lhyatt@gmail.com>
PR preprocessor/49973
* unicode/from_glibc/unicode_utils.py: Support script from
glibc (commit 464cd3) to extract character widths from Unicode data
files.
* unicode/from_glibc/utf8_gen.py: Likewise.
* unicode/UnicodeData.txt: Unicode v. 12.1.0 data file.
* unicode/EastAsianWidth.txt: Likewise.
* unicode/PropList.txt: Likewise.
* unicode/gen_wcwidth.py: New utility to generate
libcpp/generated_cpp_wcwidth.h with help from the glibc support
scripts and the Unicode data files.
* unicode/unicode-license.txt: Added.
* unicode/README: New explanatory file.
libcpp/ChangeLog
2019-12-09 Lewis Hyatt <lhyatt@gmail.com>
PR preprocessor/49973
* generated_cpp_wcwidth.h: New file generated by
../contrib/unicode/gen_wcwidth.py, supports new cpp_wcwidth function.
* charset.c (compute_next_display_width): New function to help
implement display columns.
(cpp_byte_column_to_display_column): Likewise.
(cpp_display_column_to_byte_column): Likewise.
(cpp_wcwidth): Likewise.
* include/cpplib.h (cpp_byte_column_to_display_column): Declare.
(cpp_display_column_to_byte_column): Declare.
(cpp_wcwidth): Declare.
(cpp_display_width): New function.
gcc/ChangeLog
2019-12-09 Lewis Hyatt <lhyatt@gmail.com>
PR preprocessor/49973
* input.c (location_compute_display_column): New function to help with
multibyte awareness in diagnostics.
(test_cpp_utf8): New self-test.
(input_c_tests): Call the new test.
* input.h (location_compute_display_column): Declare.
* diagnostic-show-locus.c: Pervasive changes to add multibyte awareness
to all classes and functions.
(enum column_unit): New enum.
(class exploc_with_display_col): New class.
(class layout_point): Convert m_column member to array m_columns[2].
(layout_range::contains_point): Add col_unit argument.
(test_layout_range_for_single_point): Pass new argument.
(test_layout_range_for_single_line): Likewise.
(test_layout_range_for_multiple_lines): Likewise.
(line_bounds::convert_to_display_cols): New function.
(layout::get_state_at_point): Add col_unit argument.
(make_range): Use empty filename rather than dummy filename.
(get_line_width_without_trailing_whitespace): Rename to...
(get_line_bytes_without_trailing_whitespace): ...this.
(test_get_line_width_without_trailing_whitespace): Rename to...
(test_get_line_bytes_without_trailing_whitespace): ...this.
(class layout): m_exploc changed to exploc_with_display_col from
plain expanded_location.
(layout::get_linenum_width): New accessor member function.
(layout::get_x_offset_display): Likewise.
(layout::calculate_linenum_width): New subroutine for the constuctor.
(layout::calculate_x_offset_display): Likewise.
(layout::layout): Use the new subroutines. Add multibyte awareness.
(layout::print_source_line): Add multibyte awareness.
(layout::print_line): Likewise.
(layout::print_annotation_line): Likewise.
(line_label::line_label): Likewise.
(layout::print_any_labels): Likewise.
(layout::annotation_line_showed_range_p): Likewise.
(get_printed_columns): Likewise.
(class line_label): Rename m_length to m_display_width.
(get_affected_columns): Rename to...
(get_affected_range): ...this; add col_unit argument and multibyte
awareness.
(class correction): Add m_affected_bytes and m_display_cols
members. Rename m_len to m_byte_length for clarity. Add multibyte
awareness throughout.
(correction::insertion_p): Add multibyte awareness.
(correction::compute_display_cols): New function.
(correction::ensure_terminated): Use new member name m_byte_length.
(line_corrections::add_hint): Add multibyte awareness.
(layout::print_trailing_fixits): Likewise.
(layout::get_x_bound_for_row): Likewise.
(test_one_liner_simple_caret_utf8): New self-test analogous to the one
with _utf8 suffix removed, testing multibyte awareness.
(test_one_liner_caret_and_range_utf8): Likewise.
(test_one_liner_multiple_carets_and_ranges_utf8): Likewise.
(test_one_liner_fixit_insert_before_utf8): Likewise.
(test_one_liner_fixit_insert_after_utf8): Likewise.
(test_one_liner_fixit_remove_utf8): Likewise.
(test_one_liner_fixit_replace_utf8): Likewise.
(test_one_liner_fixit_replace_non_equal_range_utf8): Likewise.
(test_one_liner_fixit_replace_equal_secondary_range_utf8): Likewise.
(test_one_liner_fixit_validation_adhoc_locations_utf8): Likewise.
(test_one_liner_many_fixits_1_utf8): Likewise.
(test_one_liner_many_fixits_2_utf8): Likewise.
(test_one_liner_labels_utf8): Likewise.
(test_diagnostic_show_locus_one_liner_utf8): Likewise.
(test_overlapped_fixit_printing_utf8): Likewise.
(test_overlapped_fixit_printing): Adapt for changes to
get_affected_columns, get_printed_columns and class corrections.
(test_overlapped_fixit_printing_2): Likewise.
(test_linenum_sep): New constant.
(test_left_margin): Likewise.
(test_offset_impl): Helper function for new test.
(test_layout_x_offset_display_utf8): New test.
(diagnostic_show_locus_c_tests): Call new tests.
gcc/testsuite/ChangeLog:
2019-12-09 Lewis Hyatt <lhyatt@gmail.com>
PR preprocessor/49973
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.c
(test_show_locus): Tweak so that expected output is the same as
before the diagnostic-show-locus.c changes.
* gcc.dg/cpp/pr66415-1.c: Likewise.
Jonathan Wakely [Mon, 9 Dec 2019 17:35:24 +0000 (17:35 +0000)]
libstdc++: Implement ranges::safe_range for C++20 (P1870R1)
This change replaces the __forwarding_range implementation detail with
the ranges::safe_range concept and adds the ranges::enable_safe_range
variable template for opt-in in to the concept.
It also adjusts the begin/end/rbegin/rend customization point objects to
match the new rules for accessing rvalue ranges only when safe to do so.
* include/bits/range_access.h (ranges::enable_safe_range): Define.
(ranges::begin, ranges::end, ranges::rbegin, ranges::rend): Constrain
to only accept types satisfying safe_range and treat argument as an
lvalue when calling a member of performing ADL.
(ranges::__detail::__range_impl, ranges::__detail::__forwarding_range):
Remove.
(ranges::range): Adjust definition.
(ranges::safe_range): Define.
(ranges::iterator_t, ranges::range_difference_t): Reorder definitions
to match the synopsis in the working draft.
(ranges::disable_sized_range): Remove duplicate definition.
* include/experimental/string_view (ranges::enable_safe_range): Add
partial specialization for std::experimental::basic_string_view.
* include/std/ranges (ranges::viewable_range, ranges::subrange)
(ranges::empty_view, ranges::iota_view): Use safe_range. Specialize
enable_safe_range.
(ranges::safe_iterator_t, ranges::safe_subrange_t): Define.
* include/std/span (ranges::enable_safe_range): Add partial
specialization for std::span.
* include/std/string_view (ranges::enable_safe_range): Likewise for
std::basic_string_view.
* testsuite/std/ranges/access/begin.cc: Adjust expected results.
* testsuite/std/ranges/access/cbegin.cc: Likewise.
* testsuite/std/ranges/access/cdata.cc: Likewise.
* testsuite/std/ranges/access/cend.cc: Likewise.
* testsuite/std/ranges/access/crbegin.cc: Likewise.
* testsuite/std/ranges/access/crend.cc: Likewise.
* testsuite/std/ranges/access/data.cc: Likewise.
* testsuite/std/ranges/access/end.cc: Likewise.
* testsuite/std/ranges/access/rbegin.cc: Likewise.
* testsuite/std/ranges/access/rend.cc: Likewise.
* testsuite/std/ranges/empty_view.cc: Test ranges::begin and
ranges::end instead of unqualified calls to begin and end.
* testsuite/std/ranges/safe_range.cc: New test.
* testsuite/std/ranges/safe_range_types.cc: New test.
* testsuite/util/testsuite_iterators.h: Add comment about safe_range.
Eric Botcazou [Mon, 9 Dec 2019 16:41:30 +0000 (16:41 +0000)]
tree.c (build_array_type_1): Add SET_CANONICAL parameter and compute TYPE_CANONICAL from the element type...
* tree.c (build_array_type_1): Add SET_CANONICAL parameter and compute
TYPE_CANONICAL from the element type only if it is true. Remove a few
obsolete lines and adjust recursive call.
(fld_process_array_type): Adjust call to build_array_type_1.
(build_array_type): Likewise.
(build_nonshared_array_type): Likewise.
Fix column information for omp_clauses in Fortran code
The location of all OpenMP/OpenACC clauses on any given line in Fortran code
always points to the first clause on that line. Hence, the column information
is wrong for all clauses but the first one.
Use the correct location for each clause instead.
2019-12-09 Frederik Harwath <frederik@codesourcery.com>
/gcc/fortran/
* trans-openmp.c (gfc_trans_omp_reduction_list): Pass correct location for each
clause to build_omp_clause.
Joseph Myers [Mon, 9 Dec 2019 13:59:24 +0000 (13:59 +0000)]
Fix libdecnumber handling of non-canonical BID significands (PR middle-end/91226).
As reported in bug 91226, the libdecnumber code used on the host to
interpret DFP values in the BID encoding fails, for _Decimal64 and
_Decimal128, to check for the case where a significand is too large
and so specified in IEEE 754 to be a non-canonical encoding of the
zero significand. This patch adds the required handling of that case,
together with tests both using -O2 (testing this host code) and -O0
(testing libgcc code, which already worked before the patch); the
tests also cover _Decimal32, which already had the required check.
In the _Decimal128 case, where the code previously completely ignored
the case where the first four bits of the combination field are 1100,
1101 or 1110, the logic for determining the correct quantum exponent
in that case is also newly added by this patch, so tests are added for
that as well (again, libgcc already handled it correctly when the
conversion was done at runtime rather than at compile time).
Bootstrapped with no regressions for x86_64-pc-linux-gnu.
PR middle-end/91226
libdecnumber:
* bid/bid2dpd_dpd2bid.c (_bid_to_dpd64): Handle non-canonical
significands.
(_bid_to_dpd128): Likewise. Check for case where combination
field starts 1100, 1101 or 1110.
arm: fix v[78]-r multilibs when configured with --with-multlib-list=aprofile
When gcc for Arm is configured with --with-multilib-list=aprofile a
misplaced endif directive in the makefile was causing the arm->thumb
mapping for multilibs to be omitted from the reuse rules. This
resulted in the default multilib being picked rather than the thumb2
opimized version.
* config/arm/t-multilib: Use arm->thumb multilib reuse rules
on a-profile.
rs6000: Name set<mode>_cc, and delete some old mfcr patterns
This names the so far unnamed basic mfcr pattern "set<mode>_cc", and
it deletes all the others (only the ashift one ever was generated, and
even that one only once during a whole bootstrap+regtest, and that one
is questionable -- we don't cost that pattern correctly).
* config/rs6000/rs6000.md (unnamed mfcr define_insn): Name this
set<mode>_cc.
(unnamed define_insn_and_split): Delete.
(unnamed define_insn): Delete.
(unnamed define_insn): Delete.
(unnamed define_split): Delete.
[mid-end] Add notes to dataflow insn info when re-emitting (PR92410)
In scheduling passes, notes are removed with `remove_notes` before the
scheduling is done, and added back in with `reemit_notes` once the
scheduling has been decided.
This process leaves the notes in the RTL chain with different insn uid's
than were there before. Having different UID's (larger than the
previous ones) means that DF_INSN_INFO_GET(insn) will access outside of
the allocated array.
This has been seen in the `regstat_bb_compute_calls_crossed` function.
This patch adds an assert to the `regstat_bb_compute_calls_crossed`
function so that bad accesses here are caught instead of going
unnoticed, and then avoids the problem.
We avoid the problem by ensuring that new notes added by `reemit_notes` have an
insn record given to them. This is done by adding a call to
`df_insn_create_insn_record` on each note added in `reemit_notes`.
`df_insn_create_insn_record` leaves this new record zeroed out, which appears
to be fine for notes (e.g. `df_bb_refs_record` already does not set
anything except the luid for notes, and notes have no dataflow information to
record).
We add the testcase that Martin found here
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92410#c2 .
This testcase fails with the "regstat.c" change, and then succeeds with the
"haifa-sched.c" change.
There is a similar problem with labels, that the `gcc_assert` catches
when running regression tests in gcc.dg/fold-eqandshift-1.c and
gcc.c-torture/compile/pr32482.c.
This is due to the `cfg_layout_finalize` call in `bb-reorder.c` emitting
new labels, and these labels not having a dataflow df_insn_info member.
We solve this by manually calling `df_recompute_luids` on each basic
block once this pass has finished.
Testing done:
Ran regression tests on aarch64-none-linux-gnu cross compiler.
Bootstrapped and ran tests on aarch64-none-linux-gnu native.
gcc/ChangeLog:
2019-12-09 Matthew Malcomson <matthew.malcomson@arm.com>
PR middle-end/92410
* bb-reorder.c (pass_reorder_blocks::execute): Recompute
dataflow luids once basic blocks have been reordered.
* haifa-sched.c (reemit_notes): Create df insn record for each
new note.
* regstat.c (regstat_bb_compute_calls_crossed): Assert every
insn has an insn record before trying to use it.
gcc/testsuite/ChangeLog:
2019-12-09 Matthew Malcomson <matthew.malcomson@arm.com>
PR middle-end/92410
* gcc.dg/torture/pr92410.c: New test.
Thomas Schwinge [Mon, 9 Dec 2019 11:40:36 +0000 (12:40 +0100)]
[PR92511] More testing for OpenACC "present" subarrays
In particular, "subset subarrays".
libgomp/
PR libgomp/92511
* testsuite/libgomp.oacc-c-c++-common/copyin-devptr-1.c: Remove
this file...
* testsuite/libgomp.oacc-c-c++-common/copyin-devptr-2.c: ..., and
this file...
* testsuite/libgomp.oacc-c-c++-common/lib-22.c: ..., and this
file...
* testsuite/libgomp.oacc-c-c++-common/lib-30.c: ..., and this
file...
* testsuite/libgomp.oacc-c-c++-common/subset-subarray-mappings-1-r-p.c:
... with their content moved into, and extended in this new file.
* testsuite/libgomp.oacc-c-c++-common/subset-subarray-mappings-1-d-a.c:
New file.
* testsuite/libgomp.oacc-c-c++-common/subset-subarray-mappings-1-d-p.c:
Likewise.
* testsuite/libgomp.oacc-c-c++-common/subset-subarray-mappings-1-r-a.c:
Likewise.
* testsuite/libgomp.oacc-c-c++-common/subset-subarray-mappings-2.c:
Likewise.
Sudakshina Das [Mon, 9 Dec 2019 10:22:01 +0000 (10:22 +0000)]
[GCC, Vect] Fix costing for vector shifts
While looking at the vectorization for following example, we realized that
even though vectorizable_shift function was distinguishing vector shifted
by vector from vector shifted by scalar, while modelling the cost it would
always add the cost of building a vector constant despite not needing it for
vector shifted by scalar.
This patch fixes this by using scalar_shift_arg to determine whether we need
to build a vector for the second operand or not. This causes the test case
below to now vectorize.
gcc/ChangeLog:
2019-12-09 Sudakshina Das <sudi.das@arm.com>
Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-stmt.c (vectorizable_shift): Condition ndts for
vect_model_simple_cost call on scalar_shift_arg.
gcc/testsuite/ChangeLog:
2019-12-09 Sudakshina Das <sudi.das@arm.com>
* gcc.dg/vect/vect-shift-5.c: New test.
Co-Authored-By: Richard Sandiford <richard.sandiford@arm.com>
From-SVN: r279114
Jakub Jelinek [Mon, 9 Dec 2019 10:13:18 +0000 (11:13 +0100)]
re PR tree-optimization/92834 (misssed SLP vectorization in LightPixel)
PR tree-optimization/92834
* match.pd (A - ((A - B) & -(C cmp D)) -> (C cmp D) ? B : A,
A + ((B - A) & -(C cmp D)) -> (C cmp D) ? B : A): New simplifications.
PR tree-optimization/89007
* tree-vect-patterns.c (vect_recog_average_pattern): If there is no
target support available, generate code to distribute rshift over plus
and add a carry.
testsuite/
* gcc.target/aarch64/sve/pr89007-1.c: New test.
* gcc.target/aarch64/sve/pr89007-2.c: Likewise.
Jonathan Wakely [Mon, 9 Dec 2019 09:58:56 +0000 (09:58 +0000)]
libstdc++: fix buffer overflow in path::operator+= (PR92853)
When concatenating a path ending in a root-directory onto another path,
we added an empty filename to the end of the path twice, but only
reserved space for one. That meant the second write went past the end of
the allocated buffer.
PR libstdc++/92853
* src/c++17/fs_path.cc (filesystem::path::operator+=(const path&)):
Do not process a trailing directory separator twice.
* testsuite/27_io/filesystem/path/concat/92853.cc: New test.
* testsuite/27_io/filesystem/path/concat/path.cc: Test more cases.