typeck.c (decay_conversion): Don't confuse constant array variables with their intiailizers.

* typeck.c (decay_conversion): Don't confuse constant array
	variables with their intiailizers.

From-SVN: r25459
This commit is contained in:
Mark Mitchell 1999-02-26 12:15:37 +00:00 committed by Mark Mitchell
parent 2b0a63a35b
commit 5f56af5a8d
3 changed files with 37 additions and 10 deletions

View File

@ -1,5 +1,8 @@
1999-02-26 Mark Mitchell <mark@markmitchell.com> 1999-02-26 Mark Mitchell <mark@markmitchell.com>
* typeck.c (decay_conversion): Don't confuse constant array
variables with their intiailizers.
* decl.c (duplicate_decls): Copy DECL_TEMPLATE_INSTANTIATED when * decl.c (duplicate_decls): Copy DECL_TEMPLATE_INSTANTIATED when
merging decls. merging decls.
* pt.c (regenerate_decl_from_template): Tweak for clarity. * pt.c (regenerate_decl_from_template): Tweak for clarity.

View File

@ -1589,12 +1589,11 @@ c_alignof (type)
return t; return t;
} }
/* Perform default promotions for C data used in expressions. /* Perform the array-to-pointer and function-to-pointer conversions
Arrays and functions are converted to pointers; for EXP.
enumeral types or short or char, to int.
In addition, manifest constants symbols are replaced by their values.
C++: this will automatically bash references to their target type. */ In addition, references are converted to rvalues and manifest
constants are replaced by their values. */
tree tree
decay_conversion (exp) decay_conversion (exp)
@ -1628,8 +1627,15 @@ decay_conversion (exp)
/* Constants can be used directly unless they're not loadable. */ /* Constants can be used directly unless they're not loadable. */
if (TREE_CODE (exp) == CONST_DECL) if (TREE_CODE (exp) == CONST_DECL)
exp = DECL_INITIAL (exp); exp = DECL_INITIAL (exp);
/* Replace a nonvolatile const static variable with its value. */ /* Replace a nonvolatile const static variable with its value. We
else if (TREE_READONLY_DECL_P (exp)) don't do this for arrays, though; we want the address of the
first element of the array, not the address of the first element
of its initializing constant. We *do* replace variables that the
user isn't really supposed to know about; this is a hack to deal
with __PRETTY_FUNCTION__ and the like. */
else if (TREE_READONLY_DECL_P (exp)
&& (code != ARRAY_TYPE
|| (TREE_CODE (exp) == VAR_DECL && DECL_IGNORED_P (exp))))
{ {
exp = decl_constant_value (exp); exp = decl_constant_value (exp);
type = TREE_TYPE (exp); type = TREE_TYPE (exp);
@ -1649,9 +1655,7 @@ decay_conversion (exp)
return build_unary_op (ADDR_EXPR, exp, 0); return build_unary_op (ADDR_EXPR, exp, 0);
} }
if (code == FUNCTION_TYPE || is_overloaded_fn (exp)) if (code == FUNCTION_TYPE || is_overloaded_fn (exp))
{ return build_unary_op (ADDR_EXPR, exp, 0);
return build_unary_op (ADDR_EXPR, exp, 0);
}
if (code == ARRAY_TYPE) if (code == ARRAY_TYPE)
{ {
register tree adr; register tree adr;

View File

@ -0,0 +1,20 @@
// Build don't link:
// Origin: mrs@wrs.com (Mike Stump)
class Wrapper {
public:
static const char msgPtr[];
static const char *JunkFunc() {
return &msgPtr[0];
}
};
const char Wrapper::msgPtr[] = "Hello world.";
int main() {
const char *p1 = &Wrapper::msgPtr[0];
const char *p2 = Wrapper::JunkFunc();
if (p1 != p2)
return 1;
}