mirror of git://gcc.gnu.org/git/gcc.git
re PR c/46547 (internal compiler error when converting a complex to a bool)
PR c/46547 * c-tree.h (in_late_binary_op): Move to c-family/c-common.h. * c-typeck.c (in_late_binary_op): Move to c-family/c-common.c. c-family: * c-common.c (in_late_binary_op): Define. (c_common_truthvalue_conversion): Check in_late_binary_op before calling c_save_expr. * c-common.h (in_late_binary_op): Declare. testsuite: * gcc.c-torture/compile/pr46547-1.c: New test. From-SVN: r166951
This commit is contained in:
parent
7a336abaa1
commit
5386338c2c
|
@ -1,3 +1,9 @@
|
||||||
|
2010-11-19 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
PR c/46547
|
||||||
|
* c-tree.h (in_late_binary_op): Move to c-family/c-common.h.
|
||||||
|
* c-typeck.c (in_late_binary_op): Move to c-family/c-common.c.
|
||||||
|
|
||||||
2010-11-19 Michael Meissner <meissner@linux.vnet.ibm.com>
|
2010-11-19 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* doc/extend.texi (Function attributes): Document PowerPC target
|
* doc/extend.texi (Function attributes): Document PowerPC target
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
2010-11-19 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
PR c/46547
|
||||||
|
* c-common.c (in_late_binary_op): Define.
|
||||||
|
(c_common_truthvalue_conversion): Check in_late_binary_op before
|
||||||
|
calling c_save_expr.
|
||||||
|
* c-common.h (in_late_binary_op): Declare.
|
||||||
|
|
||||||
2010-11-19 Joseph Myers <joseph@codesourcery.com>
|
2010-11-19 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* c-opts.c (c_common_handle_option): Update calls to
|
* c-opts.c (c_common_handle_option): Update calls to
|
||||||
|
|
|
@ -271,6 +271,14 @@ tree (*make_fname_decl) (location_t, tree, int);
|
||||||
executed. */
|
executed. */
|
||||||
int c_inhibit_evaluation_warnings;
|
int c_inhibit_evaluation_warnings;
|
||||||
|
|
||||||
|
/* Whether we are building a boolean conversion inside
|
||||||
|
convert_for_assignment, or some other late binary operation. If
|
||||||
|
build_binary_op is called for C (from code shared by C and C++) in
|
||||||
|
this case, then the operands have already been folded and the
|
||||||
|
result will not be folded again, so C_MAYBE_CONST_EXPR should not
|
||||||
|
be generated. */
|
||||||
|
bool in_late_binary_op;
|
||||||
|
|
||||||
/* Whether lexing has been completed, so subsequent preprocessor
|
/* Whether lexing has been completed, so subsequent preprocessor
|
||||||
errors should use the compiler's input_location. */
|
errors should use the compiler's input_location. */
|
||||||
bool done_lexing = false;
|
bool done_lexing = false;
|
||||||
|
@ -3939,7 +3947,7 @@ c_common_truthvalue_conversion (location_t location, tree expr)
|
||||||
|
|
||||||
if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
|
if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
|
||||||
{
|
{
|
||||||
tree t = c_save_expr (expr);
|
tree t = (in_late_binary_op ? save_expr (expr) : c_save_expr (expr));
|
||||||
expr = (build_binary_op
|
expr = (build_binary_op
|
||||||
(EXPR_LOCATION (expr),
|
(EXPR_LOCATION (expr),
|
||||||
(TREE_SIDE_EFFECTS (expr)
|
(TREE_SIDE_EFFECTS (expr)
|
||||||
|
|
|
@ -675,6 +675,7 @@ extern tree (*make_fname_decl) (location_t, tree, int);
|
||||||
extern void c_register_addr_space (const char *str, addr_space_t as);
|
extern void c_register_addr_space (const char *str, addr_space_t as);
|
||||||
|
|
||||||
/* In c-common.c. */
|
/* In c-common.c. */
|
||||||
|
extern bool in_late_binary_op;
|
||||||
extern const char *c_addr_space_name (addr_space_t as);
|
extern const char *c_addr_space_name (addr_space_t as);
|
||||||
extern tree identifier_global_value (tree);
|
extern tree identifier_global_value (tree);
|
||||||
extern void record_builtin_type (enum rid, const char *, tree);
|
extern void record_builtin_type (enum rid, const char *, tree);
|
||||||
|
|
|
@ -501,7 +501,6 @@ extern void c_initialize_diagnostics (diagnostic_context *);
|
||||||
extern bool c_vla_unspec_p (tree x, tree fn);
|
extern bool c_vla_unspec_p (tree x, tree fn);
|
||||||
|
|
||||||
/* in c-typeck.c */
|
/* in c-typeck.c */
|
||||||
extern bool in_late_binary_op;
|
|
||||||
extern int in_alignof;
|
extern int in_alignof;
|
||||||
extern int in_sizeof;
|
extern int in_sizeof;
|
||||||
extern int in_typeof;
|
extern int in_typeof;
|
||||||
|
|
|
@ -51,13 +51,6 @@ enum impl_conv {
|
||||||
ic_return
|
ic_return
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Whether we are building a boolean conversion inside
|
|
||||||
convert_for_assignment, or some other late binary operation. If
|
|
||||||
build_binary_op is called (from code shared with C++) in this case,
|
|
||||||
then the operands have already been folded and the result will not
|
|
||||||
be folded again, so C_MAYBE_CONST_EXPR should not be generated. */
|
|
||||||
bool in_late_binary_op;
|
|
||||||
|
|
||||||
/* The level of nesting inside "__alignof__". */
|
/* The level of nesting inside "__alignof__". */
|
||||||
int in_alignof;
|
int in_alignof;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2010-11-19 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
PR c/46547
|
||||||
|
* gcc.c-torture/compile/pr46547-1.c: New test.
|
||||||
|
|
||||||
2010-11-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
2010-11-19 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||||
|
|
||||||
* lib/gcc-defs.exp (gcc-set-multilib-library-path): Use eval to
|
* lib/gcc-defs.exp (gcc-set-multilib-library-path): Use eval to
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
void foo (void) {
|
||||||
|
_Bool d;
|
||||||
|
long double _Complex *s;
|
||||||
|
|
||||||
|
d = *s++;
|
||||||
|
}
|
Loading…
Reference in New Issue