Commit Graph

179253 Commits

Author SHA1 Message Date
Jakub Jelinek
ba6730bd18 c++: Fix another PCH hash_map issue [PR96901]
The recent libstdc++ changes caused lots of libstdc++-v3 tests FAILs
on i686-linux, all of them in the same spot during constexpr evaluation
of a recursive _S_gcd call.
The problem is yet another hash_map that used the default hasing of
tree keys through pointer hashing which is preserved across PCH write/read.
During PCH handling, the addresses of GC objects are changed, which means
that the hash values of the keys in such hash tables change without those
hash tables being rehashed.  Which in the fundef_copies_table case usually
means we just don't find a copy of a FUNCTION_DECL body for recursive uses
and start from scratch.  But when the hash table keeps growing, the "dead"
elements in the hash table can sometimes reappear and break things.
In particular what I saw under the debugger is when the fundef_copies_table
hash map has been used on the outer _S_gcd call, it didn't find an entry for
it, so returned a slot with *slot == NULL, which is treated as that the
function itself is used directly (i.e. no recursion), but that addition of
a hash table slot caused the recursive _S_gcd call to actually find
something in the hash table, unfortunately not the new *slot == NULL spot,
but a different one from the pre-PCH streaming which contained the returned
toplevel (non-recursive) call entry for it, which means that for the
recursive _S_gcd call we actually used the same trees as for the outer ones
rather than a copy of those, which breaks constexpr evaluation.

2020-09-03  Jakub Jelinek  <jakub@redhat.com>

	PR c++/96901
	* tree.h (struct decl_tree_traits): New type.
	(decl_tree_map): New typedef.

	* constexpr.c (fundef_copies_table): Change type from
	hash_map<tree, tree> * to decl_tree_map *.
2020-09-03 21:53:40 +02:00
Harald Anlauf
8eeeecbcc1 PR fortran/96890 - Wrong answer with intrinsic IALL
The IALL intrinsic would always return 0 when the DIM and MASK arguments
were present since the initial value of repeated BIT-AND operations was
set to 0 instead of -1.

libgfortran/ChangeLog:

	* m4/iall.m4: Initial value for result should be -1.
	* generated/iall_i1.c (miall_i1): Generated.
	* generated/iall_i16.c (miall_i16): Likewise.
	* generated/iall_i2.c (miall_i2): Likewise.
	* generated/iall_i4.c (miall_i4): Likewise.
	* generated/iall_i8.c (miall_i8): Likewise.

gcc/testsuite/ChangeLog:

	* gfortran.dg/iall_masked.f90: New test.
2020-09-03 20:33:14 +02:00
Marek Polacek
753b4679bc c++: Fix P0960 in member init list and array [PR92812]
This patch nails down the remaining P0960 case in PR92812:

  struct A {
    int ar[2];
    A(): ar(1, 2) {} // doesn't work without this patch
  };

Note that when the target object is not of array type, this already
works:

  struct S { int x, y; };
  struct A {
    S s;
    A(): s(1, 2) { } // OK in C++20
  };

because build_new_method_call_1 takes care of the P0960 magic.

It proved to be quite hairy.  When the ()-list has more than one
element, we can always create a CONSTRUCTOR, because the code was
previously invalid.  But when the ()-list has just one element, it
gets all kinds of difficult.  As usual, we have to handle a("foo")
so as not to wrap the STRING_CST in a CONSTRUCTOR.  Always turning
x(e) into x{e} would run into trouble as in c++/93790.  Another
issue was what to do about x({e}): previously, this would trigger
"list-initializer for non-class type must not be parenthesized".
I figured I'd make this work in C++20, so that given

  struct S { int x, y; };

you can do

   S a[2];
   [...]
   A(): a({1, 2}) // initialize a[0] with {1, 2} and a[1] with {}

It also turned out that, as an extension, we support compound literals:

  F (): m((S[1]) { 1, 2 })

so this has to keep working as before.  Moreover, make sure not to trigger
in compiler-generated code, like =default, where array assignment is allowed.

I've factored out a function that turns a TREE_LIST into a CONSTRUCTOR
to simplify handling of P0960.

paren-init35.C also tests this with vector types.

gcc/cp/ChangeLog:

	PR c++/92812
	* cp-tree.h (do_aggregate_paren_init): Declare.
	* decl.c (do_aggregate_paren_init): New.
	(grok_reference_init): Use it.
	(check_initializer): Likewise.
	* init.c (perform_member_init): Handle initializing an array from
	a ()-list.  Use do_aggregate_paren_init.

gcc/testsuite/ChangeLog:

	PR c++/92812
	* g++.dg/cpp0x/constexpr-array23.C: Adjust dg-error.
	* g++.dg/cpp0x/initlist69.C: Likewise.
	* g++.dg/diagnostic/mem-init1.C: Likewise.
	* g++.dg/init/array28.C: Likewise.
	* g++.dg/cpp2a/paren-init33.C: New test.
	* g++.dg/cpp2a/paren-init34.C: New test.
	* g++.dg/cpp2a/paren-init35.C: New test.
	* g++.old-deja/g++.brendan/crash60.C: Adjust dg-error.
	* g++.old-deja/g++.law/init10.C: Likewise.
	* g++.old-deja/g++.other/array3.C: Likewise.
2020-09-03 14:30:06 -04:00
Jakub Jelinek
6641d6d3fe c++: Disable -frounding-math during manifestly constant evaluation [PR96862]
As discussed in the PR, fold-const.c punts on floating point constant
evaluation if the result is inexact and -frounding-math is turned on.
      /* Don't constant fold this floating point operation if the
         result may dependent upon the run-time rounding mode and
         flag_rounding_math is set, or if GCC's software emulation
         is unable to accurately represent the result.  */
      if ((flag_rounding_math
           || (MODE_COMPOSITE_P (mode) && !flag_unsafe_math_optimizations))
          && (inexact || !real_identical (&result, &value)))
        return NULL_TREE;
Jonathan said that we should be evaluating them anyway, e.g. conceptually
as if they are done with the default rounding mode before user had a chance
to change that, and e.g. in C in initializers it is also ignored.
In fact, fold-const.c for C initializers turns off various other options:

/* Perform constant folding and related simplification of initializer
   expression EXPR.  These behave identically to "fold_buildN" but ignore
   potential run-time traps and exceptions that fold must preserve.  */

  int saved_signaling_nans = flag_signaling_nans;\
  int saved_trapping_math = flag_trapping_math;\
  int saved_rounding_math = flag_rounding_math;\
  int saved_trapv = flag_trapv;\
  int saved_folding_initializer = folding_initializer;\
  flag_signaling_nans = 0;\
  flag_trapping_math = 0;\
  flag_rounding_math = 0;\
  flag_trapv = 0;\
  folding_initializer = 1;

  flag_signaling_nans = saved_signaling_nans;\
  flag_trapping_math = saved_trapping_math;\
  flag_rounding_math = saved_rounding_math;\
  flag_trapv = saved_trapv;\
  folding_initializer = saved_folding_initializer;

So, shall cxx_eval_outermost_constant_expr instead turn off all those
options (then warning_sentinel wouldn't be the right thing to use, but given
the 8 or how many return stmts in cxx_eval_outermost_constant_expr, we'd
need a RAII class for this.  Not sure about the folding_initializer, that
one is affecting complex multiplication and division constant evaluation
somehow.

2020-09-03  Jakub Jelinek  <jakub@redhat.com>

	PR c++/96862
	* constexpr.c (cxx_eval_outermost_constant_expr): Temporarily disable
	flag_rounding_math during manifestly constant evaluation.

	* g++.dg/cpp1z/constexpr-96862.C: New test.
2020-09-03 20:11:43 +02:00
Jonathan Wakely
032a4b42cc libstdc++: Add workaround for weird std::tuple error [PR 96592]
This "fix" makes no sense, but it avoids an error from G++ about
std::is_constructible being incomplete. The real problem is elsewhere,
but this "fixes" the regression for now.

libstdc++-v3/ChangeLog:

	PR libstdc++/96592
	* include/std/tuple (_TupleConstraints<true, T...>): Use
	alternative is_constructible instead of std::is_constructible.
	* testsuite/20_util/tuple/cons/96592.cc: New test.
2020-09-03 16:26:16 +01:00
Jonathan Wakely
3c21913415 libstdc++: Optimise GCD algorithms
The current std::gcd and std::chrono::duration::_S_gcd algorithms are
both recursive. This is potentially expensive to evaluate in constant
expressions, because each level of recursion makes a new copy of the
function to evaluate. The maximum number of steps is bounded
(proportional to the number of decimal digits in the smaller value) and
so unlikely to exceed the limit for constexpr nesting, but the memory
usage is still suboptimal. By using an iterative algorithm we avoid
that compile-time cost. Because looping in constexpr functions is not
allowed until C++14, we need to keep the recursive implementation in
duration::_S_gcd for C++11 mode.

For std::gcd we can also optimise runtime performance by using the
binary GCD algorithm.

libstdc++-v3/ChangeLog:

	* include/std/chrono (duration::_S_gcd): Use iterative algorithm
	for C++14 and later.
	* include/std/numeric (__detail::__gcd): Replace recursive
	Euclidean algorithm with iterative version of binary GCD algorithm.
	* testsuite/26_numerics/gcd/1.cc: Test additional inputs.
	* testsuite/26_numerics/gcd/gcd_neg.cc: Adjust dg-error lines.
	* testsuite/26_numerics/lcm/lcm_neg.cc: Likewise.
	* testsuite/experimental/numeric/gcd.cc: Test additional inputs.
	* testsuite/26_numerics/gcd/2.cc: New test.
2020-09-03 12:46:13 +01:00
Jakub Jelinek
3536ff2de8 lto: Cache location_ts including BLOCKs in GIMPLE streaming [PR94311]
As mentioned in the PR, when compiling valgrind even on fairly small
testcase where in one larger function the location keeps oscillating
between a small line number and 8000-ish line number in the same file
we very quickly run out of all possible location_t numbers and because of
that emit non-sensical line numbers in .debug_line.
There are ways how to decrease speed of depleting location_t numbers
in libcpp, but the main reason of this is that we use
stream_input_location_now for streaming in location_t for gimple_location
and phi arg locations.  libcpp strongly prefers that the locations
it is given are sorted by the different files and by line numbers in
ascending order, otherwise it depletes quickly no matter what and is much
more costly (many extra file changes etc.).
The reason for not caching those were the BLOCKs that were streamed
immediately after the location and encoded into the locations (and for PHIs
we failed to stream the BLOCKs altogether).
This patch enhances the location cache to handle also BLOCKs (but not for
everything, only for the spots we care about the BLOCKs) and also optimizes
the size of the LTO stream by emitting a single bit into a pack whether the
BLOCK changed from last case and only streaming the BLOCK tree if it
changed.

2020-09-03  Jakub Jelinek  <jakub@redhat.com>

	PR lto/94311
	* gimple.h (gimple_location_ptr, gimple_phi_arg_location_ptr): New
	functions.
	* streamer-hooks.h (struct streamer_hooks): Add
	output_location_and_block callback.  Fix up formatting for
	output_location.
	(stream_output_location_and_block): Define.
	* lto-streamer.h (class lto_location_cache): Fix comment typo.  Add
	current_block member.
	(lto_location_cache::input_location_and_block): New method.
	(lto_location_cache::lto_location_cache): Initialize current_block.
	(lto_location_cache::cached_location): Add block member.
	(struct output_block): Add current_block member.
	(lto_output_location): Formatting fix.
	(lto_output_location_and_block): Declare.
	* lto-streamer.c (lto_streamer_hooks_init): Initialize
	streamer_hooks.output_location_and_block.
	* lto-streamer-in.c (lto_location_cache::cmp_loc): Also compare
	block members.
	(lto_location_cache::apply_location_cache): Handle blocks.
	(lto_location_cache::accept_location_cache,
	lto_location_cache::revert_location_cache): Fix up function comments.
	(lto_location_cache::input_location_and_block): New method.
	(lto_location_cache::input_location): Implement using
	input_location_and_block.
	(input_function): Invoke apply_location_cache after streaming in all
	bbs.
	* lto-streamer-out.c (clear_line_info): Set current_block.
	(lto_output_location_1): New function, moved from lto_output_location,
	added block handling.
	(lto_output_location): Implement using lto_output_location_1.
	(lto_output_location_and_block): New function.
	* gimple-streamer-in.c (input_phi): Use input_location_and_block
	to input and cache both location and block.
	(input_gimple_stmt): Likewise.
	* gimple-streamer-out.c (output_phi): Use
	stream_output_location_and_block.
	(output_gimple_stmt): Likewise.
2020-09-03 12:51:01 +02:00
Richard Biener
b246f5272e Improve constant folding of vector lowering with vector bools
This improves the situation somewhat when vector lowering tries
to access vector bools as seen in PR96814.

2020-09-03  Richard Biener  <rguenther@suse.de>

	* tree-vect-generic.c (tree_vec_extract): Remove odd
	special-casing of boolean vectors.
	* fold-const.c (fold_ternary_loc): Handle boolean vector
	type BIT_FIELD_REFs.
2020-09-03 12:47:59 +02:00
Arnaud Charlet
3cc3a373fe Preliminary work on support for 128bits integers
* fe.h, opt.ads (Enable_128bit_Types): New.
	* stand.ads (Standard_Long_Long_Long_Integer,
	S_Long_Long_Long_Integer): New.
2020-09-03 04:34:48 -04:00
Arnaud Charlet
eb6ea9e54f Look at fullest view when checking for static types in unnesting
When seeing if any bound involved in a type is an uplevel reference,
we must look at the fullest view of a type, since that's what the
backends will do.  Similarly for private types. We introduce
Get_Fullest_View for that purpose.

	* sem_util.ads, sem_util.adb (Get_Fullest_View): New procedure.
	* exp_unst.adb (Check Static_Type): Do all processing on fullest
	view of specified type.
2020-09-03 04:15:03 -04:00
liuhongt
4337341269 Optimize memory broadcast for constant vector under AVX512.
For constant vector having one duplicated value, there's no need to put
whole vector in the constant pool, using embedded broadcast instead.

2020-07-09  Hongtao Liu  <hongtao.liu@intel.com>

gcc/ChangeLog:

	PR target/87767
	* config/i386/i386-features.c
	(replace_constant_pool_with_broadcast): New function.
	(constant_pool_broadcast): Ditto.
	(class pass_constant_pool_broadcast): New pass.
	(make_pass_constant_pool_broadcast): Ditto.
	(remove_partial_avx_dependency): Call
	replace_constant_pool_with_broadcast under TARGET_AVX512F, it
	would save compile time when both pass rpad and cpb are
	available.
	(remove_partial_avx_dependency_gate): New function.
	(class pass_remove_partial_avx_dependency::gate): Call
	remove_partial_avx_dependency_gate.
	* config/i386/i386-passes.def: Insert new pass after combine.
	* config/i386/i386-protos.h
	(make_pass_constant_pool_broadcast): Declare.
	* config/i386/sse.md (*avx512dq_mul<mode>3<mask_name>_bcst):
	New define_insn.
	(*avx512f_mul<mode>3<mask_name>_bcst): Ditto.
	* config/i386/avx512fintrin.h (_mm512_set1_ps,
	_mm512_set1_pd,_mm512_set1_epi32, _mm512_set1_epi64): Adjusted.

gcc/testsuite/ChangeLog:

	PR target/87767
	* gcc.target/i386/avx2-broadcast-pr87767-1.c: New test.
	* gcc.target/i386/avx512f-broadcast-pr87767-1.c: New test.
	* gcc.target/i386/avx512f-broadcast-pr87767-2.c: New test.
	* gcc.target/i386/avx512f-broadcast-pr87767-3.c: New test.
	* gcc.target/i386/avx512f-broadcast-pr87767-4.c: New test.
	* gcc.target/i386/avx512f-broadcast-pr87767-5.c: New test.
	* gcc.target/i386/avx512f-broadcast-pr87767-6.c: New test.
	* gcc.target/i386/avx512f-broadcast-pr87767-7.c: New test.
	* gcc.target/i386/avx512vl-broadcast-pr87767-1.c: New test.
	* gcc.target/i386/avx512vl-broadcast-pr87767-1.c: New test.
	* gcc.target/i386/avx512vl-broadcast-pr87767-2.c: New test.
	* gcc.target/i386/avx512vl-broadcast-pr87767-3.c: New test.
	* gcc.target/i386/avx512vl-broadcast-pr87767-4.c: New test.
	* gcc.target/i386/avx512vl-broadcast-pr87767-5.c: New test.
	* gcc.target/i386/avx512vl-broadcast-pr87767-6.c: New test.
2020-09-03 16:10:45 +08:00
liuhongt
8bd5530bfa Adjust testcase.
gcc/testsuite/ChangeLog:
	PR target/96246
	PR target/96855
	PR target/96856
	PR target/96857
	* g++.target/i386/avx512bw-pr96246-2.C: Add runtime check for
	AVX512BW.
	* g++.target/i386/avx512vl-pr96246-2.C: Add runtime check for
	AVX512BW and AVX512VL
	* g++.target/i386/avx512f-helper.h: New header.
	* gcc.target/i386/pr92658-avx512f.c: Add
	-mprefer-vector-width=512 to avoid impact of different default
	mtune which gcc is built with.
	* gcc.target/i386/avx512bw-pr95488-1.c: Ditto.
	* gcc.target/i386/pr92645-4.c: Add -mno-avx512f to avoid
	impact of different default march which gcc is built with.
2020-09-03 10:25:50 +08:00
GCC Administrator
6a8f4e47c9 Daily bump. 2020-09-03 00:16:26 +00:00
Iain Buclaw
f0a3bab43f d: __vectors unsupported in hardware should be rejected at compile-time.
gcc/d/ChangeLog:

	PR d/96869
	* d-builtins.cc (build_frontend_type): Don't expose intrinsics that
	use unsupported vector types.
	* d-target.cc (Target::isVectorTypeSupported): Restrict to supporting
	only if TARGET_VECTOR_MODE_SUPPORTED_P is true.  Don't allow complex
	or boolean vector types.

gcc/testsuite/ChangeLog:

	PR d/96869
	* gdc.dg/simd.d: Removed.
	* gdc.dg/cast1.d: New test.
	* gdc.dg/gdc213.d: Compile with target vect_sizes_16B_8B.
	* gdc.dg/gdc284.d: Likewise.
	* gdc.dg/gdc67.d: Likewise.
	* gdc.dg/pr96869.d: New test.
	* gdc.dg/simd1.d: New test.
	* gdc.dg/simd10447.d: New test.
	* gdc.dg/simd12776.d: New test.
	* gdc.dg/simd13841.d: New test.
	* gdc.dg/simd13927.d: New test.
	* gdc.dg/simd15123.d: New test.
	* gdc.dg/simd15144.d: New test.
	* gdc.dg/simd16087.d: New test.
	* gdc.dg/simd16697.d: New test.
	* gdc.dg/simd17237.d: New test.
	* gdc.dg/simd17695.d: New test.
	* gdc.dg/simd17720a.d: New test.
	* gdc.dg/simd17720b.d: New test.
	* gdc.dg/simd19224.d: New test.
	* gdc.dg/simd19627.d: New test.
	* gdc.dg/simd19628.d: New test.
	* gdc.dg/simd19629.d: New test.
	* gdc.dg/simd19630.d: New test.
	* gdc.dg/simd2a.d: New test.
	* gdc.dg/simd2b.d: New test.
	* gdc.dg/simd2c.d: New test.
	* gdc.dg/simd2d.d: New test.
	* gdc.dg/simd2e.d: New test.
	* gdc.dg/simd2f.d: New test.
	* gdc.dg/simd2g.d: New test.
	* gdc.dg/simd2h.d: New test.
	* gdc.dg/simd2i.d: New test.
	* gdc.dg/simd2j.d: New test.
	* gdc.dg/simd7951.d: New test.
	* gdc.dg/torture/array2.d: New test.
	* gdc.dg/torture/array3.d: New test.
	* gdc.dg/torture/simd16488a.d: New test.
	* gdc.dg/torture/simd16488b.d: New test.
	* gdc.dg/torture/simd16703.d: New test.
	* gdc.dg/torture/simd19223.d: New test.
	* gdc.dg/torture/simd19607.d: New test.
	* gdc.dg/torture/simd3.d: New test.
	* gdc.dg/torture/simd4.d: New test.
	* gdc.dg/torture/simd7411.d: New test.
	* gdc.dg/torture/simd7413a.d: New test.
	* gdc.dg/torture/simd7413b.d: New test.
	* gdc.dg/torture/simd7414.d: New test.
	* gdc.dg/torture/simd9200.d: New test.
	* gdc.dg/torture/simd9304.d: New test.
	* gdc.dg/torture/simd9449.d: New test.
	* gdc.dg/torture/simd9910.d: New test.
2020-09-02 22:59:35 +02:00
Iain Buclaw
c285126cc0 d: Only test with default permutation flags for runnable tests.
Unless the test explicitly requests, all compilable tests as well as
fail_compilation tests will be ran without any extra flags.

The C++ tests now are checked against shared D runtime library.

gcc/testsuite/ChangeLog:

	* lib/gdc-utils.exp (gdc-convert-test): Handle LINK directive.
	Set PERMUTE_ARGS as DEFAULT_DFLAGS only for runnable tests.
	(gdc-do-test): Set default action of compilable tests to compile.
	Test SHARED_OPTION on runnable_cxx tests.
2020-09-02 22:59:34 +02:00
Iain Buclaw
72ddef620b d: Move all runnable tests in gdc.dg to gdc.dg/torture
Tests that are not executed do not need to be compiled as torture tests,
they are only present for testing for a certain bug or ICE.

gcc/testsuite/ChangeLog:

	* gdc.dg/dg.exp: Remove torture options.
	* gdc.dg/gdc115.d: Move test to gdc.dg/torture.
	* gdc.dg/gdc131.d: Likewise.
	* gdc.dg/gdc141.d: Likewise.
	* gdc.dg/gdc17.d: Likewise.
	* gdc.dg/gdc171.d: Likewise.
	* gdc.dg/gdc179.d: Likewise.
	* gdc.dg/gdc186.d: Likewise.
	* gdc.dg/gdc187.d: Likewise.
	* gdc.dg/gdc191.d: Likewise.
	* gdc.dg/gdc198.d: Likewise.
	* gdc.dg/gdc200.d: Likewise.
	* gdc.dg/gdc210.d: Likewise.
	* gdc.dg/gdc240.d: Likewise.
	* gdc.dg/gdc242b.d: Likewise.
	* gdc.dg/gdc248.d: Likewise.
	* gdc.dg/gdc250.d: Likewise.
	* gdc.dg/gdc273.d: Likewise.
	* gdc.dg/gdc283.d: Likewise.
	* gdc.dg/gdc285.d: Likewise.
	* gdc.dg/gdc286.d: Likewise.
	* gdc.dg/gdc309.d: Likewise.
	* gdc.dg/gdc35.d: Likewise.
	* gdc.dg/gdc36.d: Likewise.
	* gdc.dg/gdc51.d: Likewise.
	* gdc.dg/gdc57.d: Likewise.
	* gdc.dg/gdc66.d: Likewise.
	* gdc.dg/imports/gdc36.d: Likewise.
	* gdc.dg/init1.d: Likewise.
	* gdc.dg/pr92309.d: Likewise.
	* gdc.dg/pr94424.d: Likewise.
	* gdc.dg/pr94777b.d: Likewise.
	* gdc.dg/pr96152.d: Likewise.
	* gdc.dg/pr96153.d: Likewise.
	* gdc.dg/pr96156.d: Likewise.
	* gdc.dg/pr96157a.d: Likewise.
	* gdc.dg/torture/torture.exp: New file.
2020-09-02 22:59:34 +02:00
Jonathan Wakely
f049cda373 c++: Stop defining true, false and bool as macros in <stdbool.h>
Since r216679 these macros have only been defined in C++98 mode, rather
than all modes. That is permitted as a GNU extension because that header
doesn't exist in the C++ standard until C++11, so we can make it do
whatever we want for C++98. But as discussed in the PR c++/60304
comments, these macros shouldn't ever be defined for C++.

This patch removes the macro definitions for C++98 too.

The new test already passed for C++98 (and the conversion is ill-formed
in C++11 and later) so this new test is arguably unnecessary.

gcc/ChangeLog:

	PR c++/60304
	* ginclude/stdbool.h (bool, false, true): Never define for C++.

gcc/testsuite/ChangeLog:

	PR c++/60304
	* g++.dg/warn/Wconversion-null-5.C: New test.
2020-09-02 18:51:28 +01:00
Jonathan Wakely
ce90d203ce testsuite: Add missing <exception> header to testcase
This test no longer compiles because <new> stopped including
<exception>, so std::set_terminate is not defined.

gcc/testsuite/ChangeLog:

	* g++.old-deja/g++.abi/cxa_vec.C: Include <exception> for
	std::set_terminate.
2020-09-02 18:41:20 +01:00
Jonathan Wakely
c71644776f libstdc++: Fix test to use correct function
This was copied from a test for std::lcm but I forgot to change one of
the calls to use the experimental version of the function.

libstdc++-v3/ChangeLog:

	PR libstdc++/92978
	* testsuite/experimental/numeric/92978.cc: Use experimental::lcm
	not std::lcm.
2020-09-02 17:22:47 +01:00
Jozef Lawrynowicz
0edc2c1a24 MSP430: Fix -mlarge documentation to indicate size_t is a 20-bit type
gcc/ChangeLog:

	* doc/invoke.texi (MSP430 options): Fix -mlarge description to
	indicate size_t is a 20-bit type.
2020-09-02 16:50:59 +01:00
Jonathan Wakely
2f983fa690 libstdc++: Fix three-way comparison for std::array [PR 96851]
The spaceship operator for std::array uses memcmp when the
__is_byte<value_type> trait is true, but memcmp isn't usable in
constexpr contexts. Also, memcmp should only be used for unsigned byte
types, because it gives the wrong answer for signed chars with negative
values.

We can simply check std::is_constant_evaluated() so that we don't use
memcmp during constant evaluation.

To fix the problem of using memcmp for inappropriate types, this patch
adds new __is_memcmp_ordered and __is_memcmp_ordered_with traits. These
say whether using memcmp will give the right answer for ordering
operations such as lexicographical_compare and three-way comparisons.
The new traits can be used in several places, and can also be used to
implement my suggestion in PR 93059 comment 37 to use memcmp for
unsigned integers larger than one byte on big endian targets.

libstdc++-v3/ChangeLog:

	PR libstdc++/96851
	* include/bits/cpp_type_traits.h (__is_memcmp_ordered):
	New trait that says if memcmp can be used for ordering.
	(__is_memcmp_ordered_with): Likewise, for two types.
	* include/bits/deque.tcc (__lex_cmp_dit): Use new traits
	instead of __is_byte and __numeric_traits.
	(__lexicographical_compare_aux1): Likewise.
	* include/bits/ranges_algo.h (__lexicographical_compare_fn):
	Likewise.
	* include/bits/stl_algobase.h (__lexicographical_compare_aux1)
	(__is_byte_iter): Likewise.
	* include/std/array (operator<=>): Likewise. Only use memcmp
	when std::is_constant_evaluated() is false.
	* testsuite/23_containers/array/comparison_operators/96851.cc:
	New test.
	* testsuite/23_containers/array/tuple_interface/get_neg.cc:
	Adjust dg-error line numbers.
2020-09-02 15:32:11 +01:00
Jozef Lawrynowicz
d45a6c7099 MSP430: Skip gcc.dg/pr55940.c in the small memory model
In the MSP430 small memory model, there is a 16-bit address space and
pointer arithmetic wraps around the address space, so any calculated
address is always within this range.

In this test, pointer arithmetic wraps when 0x1000 is added to the
address of a variable, causing the resulting address to be unexpectedly
less than 0x2000, which breaks the test.

gcc/testsuite/ChangeLog:

	* gcc.dg/pr55940.c: Skip for msp430 unless -mlarge is specified.
2020-09-02 14:18:09 +01:00
Jonathan Wakely
6bdbf0f37b libstdc++: Break header cycle between <new> and <exception>
The <new> and <exception> headers each include each other, which makes
building them as header-units "exciting". The <new> header only needs
the definition of std::exception (in order to derive from it) which is
already in its own header, so just include that.

libstdc++-v3/ChangeLog:

	* include/bits/stl_iterator.h: Include <bits/exception_defines.h>
	for definitions of __try, __catch and __throw_exception_again.
	(counted_iterator::operator++(int)): Use __throw_exception_again
	instead of throw.
	* libsupc++/new: Include <bits/exception.h> not <exception>.
	* libsupc++/new_opvnt.cc: Include <bits/exception_defines.h>.
	* testsuite/18_support/destroying_delete.cc: Include
	<type_traits> for std::is_same_v definition.
	* testsuite/20_util/variant/index_type.cc: Qualify size_t.
2020-09-02 13:56:32 +01:00
Jakub Jelinek
b567d3bd30 fortran: Fix o'...' boz to integer/real conversions [PR96859]
The standard says that excess digits from boz are truncated.
For hexadecimal or binary, the routines copy just the number of digits
that will be needed, but for octal we copy number of digits that
contain one extra bit (for 8-bit, 32-bit or 128-bit, i.e. kind 1, 4 and 16)
or two extra bits (for 16-bit or 64-bit, i.e. kind 2 and 8).
The clearing of the first bit is done correctly by changing the first digit
if it is 4-7 to one smaller by 4 (i.e. modulo 4).
The clearing of the first two bits is done by changing 4 or 6 to 0
and 5 or 7 to 1, which is incorrect, because we really want to change the
first digit to 0 if it was even, or to 1 if it was odd, so digits
2 and 3 are mishandled by keeping them as is, rather than changing 2 to 0
and 3 to 1.

2020-09-02  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/96859
	* check.c (gfc_boz2real, gfc_boz2int): When clearing first two bits,
	change also '2' to '0' and '3' to '1' rather than just handling '4'
	through '7'.

	* gfortran.dg/pr96859.f90: New test.
2020-09-02 12:18:46 +02:00
Roger Sayle
6640a5b9e7 hppa: Improve hppa_rtx_costs for shifts by constants.
This patch provides more accurate rtx_costs estimates for shifts by
integer constants (which are cheaper than by a register amount).

2020-09-02  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog
	* config/pa/pa.c (hppa_rtx_costs) [ASHIFT, ASHIFTRT, LSHIFTRT]:
	Provide accurate costs for shifts of integer constants.
2020-09-02 09:30:50 +01:00
Jose E. Marchesi
7047a8bab6 bpf: use the default asm_named_section target hook
This patch makes the BPF backend to not provide its own implementation
of the asm_named_section hook; the default handler works perfectly
well.

2020-09-02  Jose E. Marchesi  <jose.marchesi@oracle.com>

	gcc/
	* config/bpf/bpf.c (bpf_asm_named_section): Delete.
	(TARGET_ASM_NAMED_SECTION): Likewise.
2020-09-02 09:12:51 +02:00
Jose E. Marchesi
c9d4402235 bpf: use elfos.h
BPF is an ELF-based target, so it definitely benefits from using
elfos.h.  This patch makes the target to use it, and removes
superfluous definitions from bpf.h which are better defined in
elfos.h.

Note that BPF, despite being an ELF target, doesn't use DWARF.  At
some point it will generate DWARF when generating xBPF (-mxbpf) and
BTF when generating plain eBPF, but for the time being it just
generates stabs.

2020-09-02  Jose E. Marchesi  <jemarch@gnu.org>

	gcc/
	* config.gcc: Use elfos.h in bpf-*-* targets.
	* config/bpf/bpf.h (MAX_OFILE_ALIGNMENT): Remove definition.
	(COMMON_ASM_OP): Likewise.
	(INIT_SECTION_ASM_OP): Likewise.
	(FINI_SECTION_ASM_OP): Likewise.
	(ASM_OUTPUT_SKIP): Likewise.
	(ASM_OUTPUT_ALIGNED_COMMON): Likewise.
	(ASM_OUTPUT_ALIGNED_LOCAL): Likewise.
2020-09-02 09:12:21 +02:00
GCC Administrator
e1a4a8a03f Daily bump. 2020-09-02 00:16:25 +00:00
Martin Sebor
0c344a649d Use the determined lower bound of the range of offsets in a PLUS_EXPR.
gcc/ChangeLog:

	* builtins.c (compute_objsize):  Only replace the upper bound
	of a POINTER_PLUS offset when it's less than the lower bound.

gcc/testsuite/ChangeLog:

	* gcc.dg/Wstringop-overflow.c: Remove xfails.
	* gcc.dg/Wstringop-overflow-42.c: New test.
	* gcc.dg/Wstringop-overread-4.c: New test.
2020-09-01 16:03:25 -06:00
Marek Polacek
b1c59b31ef c++: Allow new char[4]{"foo"} [PR77841]
Currently, we allow new char[]{"foo"}, but not new char[4]{"foo"}.
We should accept the latter too: [dcl.init.list]p3.3 says to treat
this as [dcl.init.string].

We were rejecting this code because we never called reshape_init before
the digest_init in build_new_1.  reshape_init handles [dcl.init.string]
by unwrapping the STRING_CST from its enclosing { }, and digest_init
assumes that reshape_init has been called for aggregates anyway, and an
array is an aggregate.

gcc/cp/ChangeLog:

	PR c++/77841
	* init.c (build_new_1): Call reshape_init.

gcc/testsuite/ChangeLog:

	PR c++/77841
	* g++.dg/cpp0x/initlist-new4.C: New test.
2020-09-01 17:49:20 -04:00
Jonathan Wakely
10f51543bb libstdc++: Add compile-time checks to__glibcxx_assert [PR 71960]
This change evaluates __glibcxx_assert checks unconditionally when a
function is being constant evaluated (when std::is_constant_evaluated()
is true). If the check fails, compilation will fail with an error.

If the function isn't being constant evaluated, the normal runtime check
will be done if enabled by _GLIBCXX_ASSERTIONS or _GLIBCXX_DEBUG, the
same as before.

Tangentially, the __glibcxx_assert and _GLIBCXX_PARALLEL_ASSERT macros
are changed to expand to 'do { } while (false)' when assertions are
disabled, instead of expanding to nothing. This avoids -Wempty-body
warnings when a disabled assertion is used in an 'if' or 'else'
statement e.g.

  if constexpr (/* precondition is testable */)
    __glibcxx_assert(precondition);

a.C:9:27: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
    9 |     __glibcxx_assert(precondition);
      |                                  ^

libstdc++-v3/ChangeLog:

	PR libstdc++/71960
	* include/bits/c++config (__glibcxx_assert_impl): Remove
	do-while so that uses of the macro need to add it.
	(__glibcxx_assert): Rename macro for runtime assertions
	to __glibcxx_assert_2.
	(__glibcxx_assert_1): Define macro for constexpr assertions.
	(__glibcxx_assert): Define macro for constexpr and runtime
	assertions.
	* include/bits/range_access.h (ranges::advance): Remove
	redundant precondition checks during constant evaluation.
	* include/parallel/base.h (_GLIBCXX_PARALLEL_ASSERT): Always
	use do-while in macro expansion.
	* include/std/ranges (iota_view::iota_view(W, B)): Remove
	redundant braces.
2020-09-01 20:52:26 +01:00
Peter Bergner
8bc0f24d7a rs6000: MMA built-in dies with incorrect sharing of tree nodes error
When we expand our MMA built-ins into gimple, we erroneously reused the
accumulator memory reference for both the source input value as well as
the destination output value.  This led to a tree sharing error.
The solution is to create separate memory references for the input
and output values.

2020-09-01  Peter Bergner  <bergner@linux.ibm.com>

gcc/
	PR target/96808
	* config/rs6000/rs6000-call.c (rs6000_gimple_fold_mma_builtin): Do not
	reuse accumulator memory reference for source and destination accesses.

gcc/testsuite/
	PR target/96808
	* gcc.target/powerpc/pr96808.c: New test.
2020-09-01 13:49:40 -05:00
Jonathan Wakely
b1850c617b libstdc++: Constrain chrono::duration conversions [LWG 2094]
The chrono::duration constructor that converts from another duration
type is meant to be constrained so that it doesn't participate in
overload resolution if the ratio of the periods cannot be represented as
a std::ratio.

Because our std::ratio_divide is not SFINAE-friendly the evaluation of
__is_harmonic results in an error outside the immediate context when an
overflow occurs. I intend to make ratio_divide (and ratio_multiply)
SFINAE-friendly in a future patch, but for now this patch just
introduces a new SFINAE-friendly alias template for the division.

The standard doesn't require it, but it also seems right to constrain
the constructor with std::is_convertible_v<_Rep2, rep>.

libstdc++-v3/ChangeLog:

	* include/std/chrono (duration::_S_gcd(intmax_t, intmax_t)):
	New helper function for finding GCD of two positive intmax_t
	values.
	(duration::__divide): New helper alias for dividing one period
	by another.
	(duration::__is_harmonic): Use __divide not ratio_divide.
	(duration(const duration<R2, P2>&)): Require the duration rep
	types to be convertible.
	* testsuite/20_util/duration/cons/dr2094.cc: New test.
	* testsuite/20_util/duration/requirements/reduced_period.cc:
	Fix definition of unused member functions in test type.
	* testsuite/20_util/duration/requirements/typedefs_neg2.cc:
	Adjust expected errors.
2020-09-01 18:18:26 +01:00
David Malcolm
49bfbf18c0 analyzer: fix false NULL deref warning after previous deref [PR96792]
gcc/analyzer/ChangeLog:
	PR analyzer/96792
	* region-model.cc (region_model::deref_rvalue): Add the constraint
	that PTR_SVAL is non-NULL.

gcc/testsuite/ChangeLog:
	PR analyzer/96792
	* gcc.dg/analyzer/pr96792.c: New test.
2020-09-01 10:56:34 -04:00
Martin Liska
a292e31dac vec: use inexact growth where possible.
gcc/ChangeLog:

	* cfgrtl.c (rtl_create_basic_block): Use default value for
	growth vector function.
	* gimple.c (gimple_set_bb): Likewise.
	* symbol-summary.h: Likewise.
	* tree-cfg.c (init_empty_tree_cfg_for_function): Likewise.
	(build_gimple_cfg): Likewise.
	(create_bb): Likewise.
	(move_block_to_fn): Likewise.
2020-09-01 14:25:52 +02:00
Martin Liska
8aa04a189b vec: default exect = false in grow functions.
gcc/ChangeLog:

	* vec.h (vec_safe_grow): Change default of exact to false.
	(vec_safe_grow_cleared): Likewise.
2020-09-01 14:25:51 +02:00
Roger Sayle
b61eaa25b0 PR middle-end/90597: gcc_assert ICE in layout_type
This patch fixes the default implementation of TARGET_VECTOR_ALIGNMENT,
known as default_vector_alignment, using the same logic as my earlier
nvptx patch, as the ICE caused by TYPE_SIZE(type) being zero during
error handling in gcc.dg/attr-vector_size.c is common among backends,
and is known in bugzilla as PR middle-end/90597, apparently a recent
regression.

2020-09-01  Roger Sayle  <roger@nextmovesoftware.com>

gcc/ChangeLog:
	PR middle-end/90597
	* targhooks.c (default_vector_alignment): Return at least the
	GET_MODE_ALIGNMENT for the type's mode.
2020-09-01 12:03:21 +01:00
Mark Eggleston
3d137b75fe Fortran : ICE on invalid code PR95398
The CLASS_DATA macro is used to shorten the code accessing the derived
components of an expressions type specification.  If the type is not
BT_CLASS the derived pointer is NULL resulting in an ICE.  To avoid
dereferencing a NULL pointer the type should be BT_CLASS.

2020-09-01  Steven G. Kargl  <kargl@gcc.gnu.org>

gcc/fortran

	PR fortran/95398
	* resolve.c (resolve_select_type): Add check for BT_CLASS
	type before using the CLASS_DATA macro which will have a
	NULL pointer to derive components if it isn't BT_CLASS.

2020-09-01  Mark Eggleston  <markeggleston@gcc.gnu.org>

gcc/testsuite

	PR fortran/95398
	* gfortran.dg/pr95398.f90: New test.
2020-09-01 10:57:05 +01:00
Richard Biener
d6a05b494b rtl-optimization/96812 - remap dependence info on RTL loop unrolling
This carries over the PR87609 fix also to RTL loop unrolling.  The
gcc.dg/torture/pr90328.c testcase otherwise is miscompiled with
the tree-ssa-address.c hunk (or alternatively with -fno-ivopts
on master).  I've tried to find the correct abstraction and
adjusted two other duplicate_insn_chain users for which I do not
have testcases.  There may be other insn-chain copying routines
that could be affected but hopefully most appropriately go through
CFG hooks.

2020-08-27  Richard Biener  <rguenther@suse.de>

	PR rtl-optimization/96812
	* tree-ssa-address.c (copy_ref_info): Also copy dependence info.
	* cfgrtl.h (duplicate_insn_chain): Adjust prototype.
	* cfgrtl.c (duplicate_insn_chain): Remap dependence info
	if requested.
	(cfg_layout_duplicate_bb): Make sure we remap dependence info.
	* modulo-sched.c (duplicate_insns_of_cycles): Remap dependence
	info.
	(generate_prolog_epilog): Adjust.
	* config/c6x/c6x.c (hwloop_optimize): Remap dependence info.
2020-09-01 11:52:10 +02:00
Jakub Jelinek
a37b0cccf4 openmp: Check for PARM_DECL before using C_ARRAY_PARAMETER or DECL_ARRAY_PARAMETER_P [PR96867]
The C++ macro performs a PARM_DECL_CHECK, so will ICE if not tested on a PARM_DECL,
C_ARRAY_PARAMETER doesn't, but probably should, otherwise it is testing e.g.
C_DECL_VARIABLE_SIZE on VAR_DECLs.

2020-09-01  Jakub Jelinek  <jakub@redhat.com>

	PR c++/96867
	* c-typeck.c (handle_omp_array_sections_1): Test C_ARRAY_PARAMETER
	only on PARM_DECLs.

	* semantics.c (handle_omp_array_sections_1): Test
	DECL_ARRAY_PARAMETER_P only on PARM_DECLs.

	* c-c++-common/gomp/pr96867.c: New test.
2020-09-01 09:17:58 +02:00
Feng Xue
ef688fdfc6 Correct Changelog for fix to PR96806 2020-09-01 10:43:16 +08:00
Kewen Lin
be7ad7dfdb test/rs6000: Add Power9 and up as vect_len target
Power9 supports vector with length in bytes load/store, this patch
is to teach check_effective_target_vect_len_load_store to take it
and its laters as effective vector with length targets.

Also supplement the documents for has_arch_pwr*.

Bootstrapped/regtested on powerpc64le-linux-gnu P8, also on
powerpc64le-linux-gnu P9 with explicit usage setting.

gcc/ChangeLog:

	* doc/sourcebuild.texi (has_arch_pwr5, has_arch_pwr6, has_arch_pwr7,
	has_arch_pwr8, has_arch_pwr9): Document.

gcc/testsuite/ChangeLog:

	* lib/target-supports.exp
	(check_effective_target_vect_len_load_store): Call check function
	check_effective_target_has_arch_pwr9.
2020-09-01 02:37:41 +00:00
GCC Administrator
13e4ba28f3 Daily bump. 2020-09-01 00:16:25 +00:00
Carl Love
1da918e153 rs6000, remove improperly defined and unsupported builtins.
gcc/ChangeLog

2020-08-31  Carl Love  <cel@us.ibm.com>

	PR target/85830
	* config/rs6000/altivec.h (vec_popcntb, vec_popcnth, vec_popcntw,
	vec_popcntd): Remove defines.
2020-08-31 18:24:23 -05:00
David Malcolm
bc62bfb0f4 analyzer: handle __builtin___memset_chk [PR96798]
gcc/analyzer/ChangeLog:
	PR analyzer/96798
	* region-model.cc (region_model::on_call_pre): Handle
	BUILT_IN_MEMSET_CHK.

gcc/testsuite/ChangeLog:
	PR analyzer/96798
	* gcc.dg/analyzer/memset-1.c (test_5a): New.
2020-08-31 18:31:49 -04:00
David Malcolm
ee7bfbe5eb analyzer: gather builtin/internal fn handling into switch statements
Clean up this code in preparation for fixing PR analyzer/96798.

gcc/analyzer/ChangeLog:
	* region-model.cc (region_model::on_call_pre): Gather handling of
	builtins and of internal fns into switch statements.  Handle
	"alloca" and BUILT_IN_ALLOCA_WITH_ALIGN.
2020-08-31 18:31:14 -04:00
David Malcolm
18056e45db analyzer: fix ICE on unknown index in CONSTRUCTOR [PR96860]
PR analyzer/96860 reports an ICE inside CONSTRUCTOR-handling with
--param analyzer-max-svalue-depth=0 when attempting to build a
binding_map for the CONSTRUCTOR's values.

The issue is that when handling (index, value) pairs for initializing
an array, the index values for the elements exceeds the svalue
complexity limit, and the index is thus treated as unknown, leading to
a symbolic rather than concrete offset for each array element.

This patch updates the CONSTRUCTOR-handling code so that it can
fail, returning an unknown value for the overall value of the
constructor for this case, fixing the ICE.

gcc/analyzer/ChangeLog:
	PR analyzer/96860
	* region.cc (decl_region::get_svalue_for_constructor): Support
	apply_ctor_to_region failing.
	* store.cc (binding_map::apply_ctor_to_region): Add failure
	handling.
	(binding_map::apply_ctor_val_to_range): Likewise.
	(binding_map::apply_ctor_pair_to_child_region): Likewise.  Replace
	assertion that child_base_offset is not symbolic with error
	handling.
	* store.h (binding_map::apply_ctor_to_region): Convert return type
	from void to bool.
	(binding_map::apply_ctor_val_to_range): Likewise.
	(binding_map::apply_ctor_pair_to_child_region): Likewise.

gcc/testsuite/ChangeLog:
	PR analyzer/96860
	* gcc.dg/analyzer/pr96860-1.c: New test.
	* gcc.dg/analyzer/pr96860-2.c: New test.
2020-08-31 18:28:59 -04:00
Marek Polacek
73a2b8dd17 c++: Implement P1009: Array size deduction in new-expressions.
This patch implements C++20 P1009, allowing code like

  new double[]{1,2,3}; // array bound will be deduced

Since this proposal makes the initialization rules more consistent, it is
applied to all previous versions of C++ (thus, effectively, all the way back
to C++11).

My patch is based on Jason's patch that handled the basic case.  I've
extended it to work with ()-init and also the string literal case.
Further testing revealed that to handle stuff like

  new int[]{t...};

in a template, we have to consider such a NEW_EXPR type-dependent.
Obviously, we first have to expand the pack to be able to deduce the
number of elements in the array.

Curiously, while implementing this proposal, I noticed that we fail
to accept

  new char[4]{"abc"};

so I've assigned 77841 to self.  I think the fix will depend on the
build_new_1 hunk in this patch.

The new tree.c function build_constructor_from_vec helps us morph
a vector into a CONSTRUCTOR more efficiently.

gcc/cp/ChangeLog:

	PR c++/93529
	* call.c (build_new_method_call_1): Use build_constructor_from_vec
	instead of build_tree_list_vec + build_constructor_from_list.
	* init.c (build_new_1): Handle new char[]{"foo"}.  Use
	build_constructor_from_vec instead of build_tree_list_vec +
	build_constructor_from_list.
	(build_new): Deduce the array size in new-expression if not
	present.  Handle ()-init.  Handle initializing an array from
	a string literal.
	* parser.c (cp_parser_new_type_id): Leave [] alone.
	(cp_parser_direct_new_declarator): Allow [].
	* pt.c (type_dependent_expression_p): In a NEW_EXPR, consider
	array types whose dimension has to be deduced type-dependent.

gcc/ChangeLog:

	PR c++/93529
	* tree.c (build_constructor_from_vec): New.
	* tree.h (build_constructor_from_vec): Declare.

gcc/testsuite/ChangeLog:

	PR c++/93529
	* g++.dg/cpp0x/sfinae4.C: Adjust expected result after P1009.
	* g++.dg/cpp2a/new-array1.C: New test.
	* g++.dg/cpp2a/new-array2.C: New test.
	* g++.dg/cpp2a/new-array3.C: New test.
	* g++.dg/cpp2a/new-array4.C: New test.

Co-authored-by: Jason Merrill <jason@redhat.com>
2020-08-31 16:09:10 -04:00
David Malcolm
0d1b4edc5f analyzer: fix ICE on RANGE_EXPR in CONSTRUCTORs [PR96763]
gcc/analyzer/ChangeLog:
	PR analyzer/96763
	* store.cc (binding_map::apply_ctor_to_region): Handle RANGE_EXPR
	by calling a new binding_map::apply_ctor_val_to_range subroutine.
	Split out the existing non-CONSTRUCTOR-handling code to a new
	apply_ctor_pair_to_child_region subroutine.
	(binding_map::apply_ctor_val_to_range): New.
	(binding_map::apply_ctor_pair_to_child_region): New, split out
	from binding_map::apply_ctor_to_region as noted above.
	* store.h (binding_map::apply_ctor_val_to_range): New decl.
	(binding_map::apply_ctor_pair_to_child_region): New decl.

gcc/testsuite/ChangeLog:
	PR analyzer/96763
	* g++.dg/analyzer/pr96763.C: New test.
2020-08-31 16:07:46 -04:00
David Malcolm
ecdb93224c analyzer: fix ICE on casting float to pointer [PR96764]
gcc/analyzer/ChangeLog:
	PR analyzer/96764
	* region-model-manager.cc
	(region_model_manager::maybe_fold_unaryop): Handle VIEW_CONVERT_EXPR.
	(region_model_manager::get_or_create_cast): Move logic for
	real->integer casting to...
	(get_code_for_cast): ...this new function, and add logic for
	real->non-integer casts.
	(region_model_manager::maybe_fold_sub_svalue): Handle
	VIEW_CONVERT_EXPR.
	* region-model.cc
	(region_model::add_any_constraints_from_gassign): Likewise.
	* svalue.cc (svalue::maybe_undo_cast): Likewise.
	(unaryop_svalue::dump_to_pp): Likewise.

gcc/testsuite/ChangeLog:
	PR analyzer/96764
	* gcc.dg/analyzer/pr96764.c: New test.
2020-08-31 16:06:50 -04:00