From 5f56af5a8d207f088d752e59d855e27a8f39b579 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 26 Feb 1999 12:15:37 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/typeck.c | 24 +++++++++++-------- .../g++.old-deja/g++.other/string1.C | 20 ++++++++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/string1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4424a3230f2..34e8ef82b8e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 1999-02-26 Mark Mitchell + * typeck.c (decay_conversion): Don't confuse constant array + variables with their intiailizers. + * decl.c (duplicate_decls): Copy DECL_TEMPLATE_INSTANTIATED when merging decls. * pt.c (regenerate_decl_from_template): Tweak for clarity. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 426d02b0903..9a99097e321 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1589,12 +1589,11 @@ c_alignof (type) return t; } -/* Perform default promotions for C data used in expressions. - Arrays and functions are converted to pointers; - enumeral types or short or char, to int. - In addition, manifest constants symbols are replaced by their values. +/* Perform the array-to-pointer and function-to-pointer conversions + for EXP. - 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 decay_conversion (exp) @@ -1628,8 +1627,15 @@ decay_conversion (exp) /* Constants can be used directly unless they're not loadable. */ if (TREE_CODE (exp) == CONST_DECL) exp = DECL_INITIAL (exp); - /* Replace a nonvolatile const static variable with its value. */ - else if (TREE_READONLY_DECL_P (exp)) + /* Replace a nonvolatile const static variable with its value. We + 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); type = TREE_TYPE (exp); @@ -1649,9 +1655,7 @@ decay_conversion (exp) return build_unary_op (ADDR_EXPR, exp, 0); } 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) { register tree adr; diff --git a/gcc/testsuite/g++.old-deja/g++.other/string1.C b/gcc/testsuite/g++.old-deja/g++.other/string1.C new file mode 100644 index 00000000000..425e9bf817c --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/string1.C @@ -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; +} -- 2.30.2