From c5c8755af05d474f2cb4c412207f20e5642b12b2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 6 Apr 2012 09:25:45 -0400 Subject: [PATCH] re PR c++/52596 ([C++11] internal compiler error: in lvalue_kind, at cp/tree.c:153) 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. From-SVN: r186187 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/semantics.c | 2 +- gcc/cp/tree.c | 10 ++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/qualified-id5.C | 17 +++++++++++++++++ 5 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/qualified-id5.C 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; +} -- 2.30.2