diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1b93ecd134d..78c43691d45 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-04-05 Jason Merrill + + PR c++/52596 + * semantics.c (finish_non_static_data_member): In templates, pass + the decl to build_qualified_name. + * tree.c (lvalue_kind) [SCOPE_REF]: Handle FIELD_DECL. + 2012-04-04 Jason Merrill PR c++/52845 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 65b771f1ee2..9bdd2ee1c89 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1590,7 +1590,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope) else if (processing_template_decl) return build_qualified_name (TREE_TYPE (decl), qualifying_scope, - DECL_NAME (decl), + decl, /*template_p=*/false); else { diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 30ad5e1b7be..05777594e54 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -151,8 +151,14 @@ lvalue_kind (const_tree ref) /* A scope ref in a template, left as SCOPE_REF to support later access checking. */ case SCOPE_REF: - gcc_assert (!type_dependent_expression_p (CONST_CAST_TREE(ref))); - return lvalue_kind (TREE_OPERAND (ref, 1)); + gcc_assert (!type_dependent_expression_p (CONST_CAST_TREE (ref))); + { + tree op = TREE_OPERAND (ref, 1); + if (TREE_CODE (op) == FIELD_DECL) + return (DECL_C_BIT_FIELD (op) ? clk_bitfield : clk_ordinary); + else + return lvalue_kind (op); + } case MAX_EXPR: case MIN_EXPR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cde30efa5a1..946f02ecf37 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-04-05 Jason Merrill + + PR c++/52596 + * g++.dg/template/qualified-id5.C: New. + 2012-04-05 Uros Bizjak PR target/52882 diff --git a/gcc/testsuite/g++.dg/template/qualified-id5.C b/gcc/testsuite/g++.dg/template/qualified-id5.C new file mode 100644 index 00000000000..3126d332de1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/qualified-id5.C @@ -0,0 +1,17 @@ +// PR c++/52596 + +struct msgpack_zone_finalizer_array { + int* tail; +}; +struct msgpack_zone { + msgpack_zone_finalizer_array finalizer_array; +}; +struct zone : public msgpack_zone { + template T* allocate(); + +}; +template +T* zone::allocate() +{ + --msgpack_zone::finalizer_array.tail; +}