From 56b4ea3de8efa797ff0edf9504704803d2ae4981 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 11 Sep 2005 21:04:03 -0700 Subject: [PATCH] decl2.c (build_anon_union_vars): Copy attributes from the base addr. * decl2.c (build_anon_union_vars): Copy attributes from the base addr. * pt.c (tsubst_decl): Substitute in DECL_VALUE_EXPR. * g++.dg/other/error8.C: Update expected diagnostic text. From-SVN: r104160 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/decl2.c | 12 +++++++++--- gcc/cp/pt.c | 7 +++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/other/error8.C | 8 ++------ 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 012b6e20fcf..4ea174c8fe7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2005-09-11 Richard Henderson + + * decl2.c (build_anon_union_vars): Copy attributes from the base addr. + * pt.c (tsubst_decl): Substitute in DECL_VALUE_EXPR. + 2005-09-09 Gabriel Dos Reis * parser.c (cp_parser_translation_unit): Simplify. The while-block diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 8ef6fa863fd..c2a90fc5bc5 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1101,12 +1101,18 @@ build_anon_union_vars (tree type, tree object) if (DECL_NAME (field)) { + tree base; + decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field)); - TREE_PUBLIC (decl) = TREE_PUBLIC (object); - TREE_STATIC (decl) = TREE_PUBLIC (object); - DECL_EXTERNAL (decl) = DECL_EXTERNAL (object); + + base = get_base_address (object); + TREE_PUBLIC (decl) = TREE_PUBLIC (base); + TREE_STATIC (decl) = TREE_STATIC (base); + DECL_EXTERNAL (decl) = DECL_EXTERNAL (base); + SET_DECL_VALUE_EXPR (decl, ref); DECL_HAS_VALUE_EXPR_P (decl) = 1; + decl = pushdecl (decl); } else if (ANON_AGGR_TYPE_P (TREE_TYPE (field))) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f78da9338cc..85e8cb83b86 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -6674,6 +6674,13 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (r) = DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (t); type = check_var_type (DECL_NAME (r), type); + + if (DECL_HAS_VALUE_EXPR_P (t)) + { + tree ve = DECL_VALUE_EXPR (t); + ve = tsubst_expr (ve, args, complain, in_decl); + SET_DECL_VALUE_EXPR (r, ve); + } } else if (DECL_SELF_REFERENCE_P (t)) SET_DECL_SELF_REFERENCE_P (r); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2b374e84c28..a4b62de4099 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2005-09-11 Richard Henderson + + * g++.dg/other/error8.C: Update expected diagnostic text. + 2005-09-11 Francois-Xavier Coudert PR libfortran/19872 diff --git a/gcc/testsuite/g++.dg/other/error8.C b/gcc/testsuite/g++.dg/other/error8.C index 1ccfe99befe..9246c2afa56 100644 --- a/gcc/testsuite/g++.dg/other/error8.C +++ b/gcc/testsuite/g++.dg/other/error8.C @@ -5,8 +5,8 @@ void foo(void) { - union { int alpha; int beta; }; // { dg-error "previous declaration of 'int alpha'" } - double alpha; // { dg-error "redeclared" } + union { int alpha; int beta; }; // { dg-error "previous declaration" } + double alpha; // { dg-error "conflicting declaration" } } // This checks both the templated version, and the position of the diagnostic @@ -20,7 +20,3 @@ void tfoo(void) }; // { dg-bogus "" "misplaced position of the declaration" { xfail *-*-* } } double alpha; // { dg-error "" "" } } - -// The duplicated error messages are xfailed for now (tracked in the PR) -// { dg-bogus "" "duplicate error messages" { target *-*-* } 8 } -// { dg-bogus "" "duplicate error messages" { target *-*-* } 9 }