re PR c++/90810 (Different intrinsics behavior on G++ 7.4 and G++ 8.3)
PR c++/90810 * init.c (constant_value_1): Handle VECTOR_CST DECL_INITIAL for !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P decls like CONSTRUCTOR. * g++.dg/ext/vector37.C: New test. From-SVN: r272152
This commit is contained in:
parent
7ac9a20184
commit
5a5da48013
|
@ -1,3 +1,9 @@
|
|||
2019-06-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/90810
|
||||
* init.c (constant_value_1): Handle VECTOR_CST DECL_INITIAL for
|
||||
!DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P decls like CONSTRUCTOR.
|
||||
|
||||
2019-06-11 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR c++/87847
|
||||
|
|
|
@ -2339,8 +2339,11 @@ constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p)
|
|||
|| TREE_CODE (init) == STRING_CST)))
|
||||
break;
|
||||
/* Don't return a CONSTRUCTOR for a variable with partial run-time
|
||||
initialization, since it doesn't represent the entire value. */
|
||||
if (TREE_CODE (init) == CONSTRUCTOR
|
||||
initialization, since it doesn't represent the entire value.
|
||||
Similarly for VECTOR_CSTs created by cp_folding those
|
||||
CONSTRUCTORs. */
|
||||
if ((TREE_CODE (init) == CONSTRUCTOR
|
||||
|| TREE_CODE (init) == VECTOR_CST)
|
||||
&& !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
|
||||
break;
|
||||
/* If the variable has a dynamic initializer, don't use its
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2019-06-11 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/90810
|
||||
* g++.dg/ext/vector37.C: New test.
|
||||
|
||||
2019-06-10 Matthew Beliveau <mbelivea@redhat.com>
|
||||
|
||||
PR c++/87250
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
// PR c++/90810
|
||||
// { dg-do run }
|
||||
|
||||
void
|
||||
foo (float x, float y)
|
||||
{
|
||||
typedef float __attribute__ ((__vector_size__ (4 * sizeof (float)), __may_alias__)) V;
|
||||
const V a = { x, x, x, x }, b = { y, y, y, y };
|
||||
const V c = a / b;
|
||||
if (c[0] != 6.0f || c[1] != 6.0f || c[2] != 6.0f || c[3] != 6.0f)
|
||||
__builtin_abort ();
|
||||
}
|
||||
|
||||
void
|
||||
bar (float y)
|
||||
{
|
||||
typedef float __attribute__ ((__vector_size__ (4 * sizeof (float)), __may_alias__)) V;
|
||||
const V a = { 7.0f, 8.0f, 9.0f, 10.0f }, b = { 1.0f, 2.0f, 3.0f, y };
|
||||
const V c = a / b;
|
||||
if (c[0] != 7.0f || c[1] != 4.0f || c[2] != 3.0f || c[3] != 5.0f)
|
||||
__builtin_abort ();
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
foo (12.0f, 2.0f);
|
||||
bar (2.0f);
|
||||
}
|
Loading…
Reference in New Issue