#include "config.h"
+#include <stdio.h>
#include "rtl.h"
#include "tree.h"
#include "flags.h"
#include "expr.h"
#include "cp-tree.h"
-#undef NULL
-#define NULL 0
+static tree extract_aggr_init PROTO((tree, tree));
+static tree extract_scalar_init PROTO((tree, tree));
+static rtx cplus_expand_expr PROTO((tree, rtx, enum machine_mode,
+ enum expand_modifier));
/* Hook used by expand_expr to expand language-specific tree codes. */
-rtx
+static rtx
cplus_expand_expr (exp, target, tmode, modifier)
tree exp;
rtx target;
tree type = TREE_TYPE (exp);
register enum machine_mode mode = TYPE_MODE (type);
register enum tree_code code = TREE_CODE (exp);
- rtx original_target = target;
int ignore = target == const0_rtx;
if (ignore)
- target = 0, original_target = 0;
+ target = 0;
/* No sense saving up arithmetic to be done
if it's all in the wrong mode to form part of an address.
result. The assumptions are true only if the address was
valid to begin with. */
call_target = validize_mem (call_target);
+
+ /* If this is a reference to a symbol, expand_inline_function
+ will do this transformation and return a different target
+ than the one we gave it, though functionally equivalent. Do
+ the transformation here to avoid confusion. */
+ if (! cse_not_expected && GET_CODE (call_target) == MEM
+ && GET_CODE (XEXP (call_target, 0)) == SYMBOL_REF)
+ {
+ call_target = gen_rtx
+ (MEM, mode, memory_address (mode, XEXP (call_target, 0)));
+ MEM_IN_STRUCT_P (call_target) = 1;
+ }
}
call_exp = build (CALL_EXPR, type, func, args, NULL_TREE);
to = XEXP (r, 0);
- if (! (to == value ||
- (GET_CODE (to) == SUBREG && XEXP (to, 0) == value)))
+ if (! (to == value
+ || (GET_CODE (to) == SUBREG && XEXP (to, 0) == value)))
return 0;
r = XEXP (r, 1);
{
if (end)
error ("case label within scope of cleanup or variable array");
+ else if (! start)
+ error ("`default' label within scope of cleanup or variable array");
else
cp_error ("case label `%E' within scope of cleanup or variable array", start);
}