[D] Fix IdentityExp comparison for complex floats.
gcc/d/ChangeLog: 2019-01-20 Johannes Pfau <johannespfau@gmail.com> * expr.cc (build_float_identity): New function. (ExprVisitor::visit(IdentityExp)): Add support for complex types. gcc/testsuite/ChangeLog: 2019-01-20 Johannes Pfau <johannespfau@gmail.com> * gdc.dg/runnable.d: Add tests for comparing complex types. From-SVN: r268103
This commit is contained in:
parent
a766ecb0d4
commit
70d87497e7
|
@ -1,3 +1,8 @@
|
||||||
|
2019-01-20 Johannes Pfau <johannespfau@gmail.com>
|
||||||
|
|
||||||
|
* expr.cc (build_float_identity): New function.
|
||||||
|
(ExprVisitor::visit(IdentityExp)): Add support for complex types.
|
||||||
|
|
||||||
2019-01-16 Iain Buclaw <ibuclaw@gdcproject.org>
|
2019-01-16 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||||
|
|
||||||
PR d/87824
|
PR d/87824
|
||||||
|
|
|
@ -43,6 +43,20 @@ along with GCC; see the file COPYING3. If not see
|
||||||
#include "d-tree.h"
|
#include "d-tree.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Build a floating-point identity comparison between T1 and T2, ignoring any
|
||||||
|
excessive padding in the type. CODE is EQ_EXPR or NE_EXPR comparison. */
|
||||||
|
|
||||||
|
static tree
|
||||||
|
build_float_identity (tree_code code, tree t1, tree t2)
|
||||||
|
{
|
||||||
|
tree tmemcmp = builtin_decl_explicit (BUILT_IN_MEMCMP);
|
||||||
|
tree size = size_int (TYPE_PRECISION (TREE_TYPE (t1)) / BITS_PER_UNIT);
|
||||||
|
|
||||||
|
tree result = build_call_expr (tmemcmp, 3, build_address (t1),
|
||||||
|
build_address (t2), size);
|
||||||
|
return build_boolop (code, result, integer_zero_node);
|
||||||
|
}
|
||||||
|
|
||||||
/* Implements the visitor interface to build the GCC trees of all Expression
|
/* Implements the visitor interface to build the GCC trees of all Expression
|
||||||
AST classes emitted from the D Front-end.
|
AST classes emitted from the D Front-end.
|
||||||
All visit methods accept one parameter E, which holds the frontend AST
|
All visit methods accept one parameter E, which holds the frontend AST
|
||||||
|
@ -282,12 +296,21 @@ public:
|
||||||
tree t1 = d_save_expr (build_expr (e->e1));
|
tree t1 = d_save_expr (build_expr (e->e1));
|
||||||
tree t2 = d_save_expr (build_expr (e->e2));
|
tree t2 = d_save_expr (build_expr (e->e2));
|
||||||
|
|
||||||
tree tmemcmp = builtin_decl_explicit (BUILT_IN_MEMCMP);
|
if (!tb1->iscomplex ())
|
||||||
tree size = size_int (TYPE_PRECISION (TREE_TYPE (t1)) / BITS_PER_UNIT);
|
this->result_ = build_float_identity (code, t1, t2);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Compare the real and imaginary parts separately. */
|
||||||
|
tree req = build_float_identity (code, real_part (t1),
|
||||||
|
real_part (t2));
|
||||||
|
tree ieq = build_float_identity (code, imaginary_part (t1),
|
||||||
|
imaginary_part (t2));
|
||||||
|
|
||||||
tree result = build_call_expr (tmemcmp, 3, build_address (t1),
|
if (code == EQ_EXPR)
|
||||||
build_address (t2), size);
|
this->result_ = build_boolop (TRUTH_ANDIF_EXPR, req, ieq);
|
||||||
this->result_ = build_boolop (code, result, integer_zero_node);
|
else
|
||||||
|
this->result_ = build_boolop (TRUTH_ORIF_EXPR, req, ieq);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (tb1->ty == Tstruct)
|
else if (tb1->ty == Tstruct)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2019-01-20 Johannes Pfau <johannespfau@gmail.com>
|
||||||
|
|
||||||
|
* gdc.dg/runnable.d: Add tests for comparing complex types.
|
||||||
|
|
||||||
2019-01-20 Kewen Lin <linkw@gcc.gnu.org>
|
2019-01-20 Kewen Lin <linkw@gcc.gnu.org>
|
||||||
|
|
||||||
* gcc.target/powerpc/altivec_vld_vst_addr.c: Remove, split into
|
* gcc.target/powerpc/altivec_vld_vst_addr.c: Remove, split into
|
||||||
|
|
|
@ -1534,6 +1534,27 @@ void test286()
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************/
|
||||||
|
// https://bugzilla.gdcproject.org/show_bug.cgi?id=309
|
||||||
|
|
||||||
|
void test309()
|
||||||
|
{
|
||||||
|
creal f1 = +0.0 + 0.0i;
|
||||||
|
creal f2 = +0.0 - 0.0i;
|
||||||
|
creal f3 = -0.0 + 0.0i;
|
||||||
|
creal f4 = +0.0 + 0.0i;
|
||||||
|
|
||||||
|
assert(f1 !is f2);
|
||||||
|
assert(f1 !is f3);
|
||||||
|
assert(f2 !is f3);
|
||||||
|
assert(f1 is f4);
|
||||||
|
|
||||||
|
assert(!(f1 is f2));
|
||||||
|
assert(!(f1 is f3));
|
||||||
|
assert(!(f2 is f3));
|
||||||
|
assert(!(f1 !is f4));
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************/
|
/******************************************/
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
@ -1571,6 +1592,7 @@ void main()
|
||||||
test273();
|
test273();
|
||||||
test285();
|
test285();
|
||||||
test286();
|
test286();
|
||||||
|
test309();
|
||||||
|
|
||||||
printf("Success!\n");
|
printf("Success!\n");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue