diff options
author | Mark Mitchell <mark@codesourcery.com> | 2002-08-23 00:28:29 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2002-08-23 00:28:29 +0000 |
commit | 5b770a964ade161bf7ae6cd9e2a0cfa55ad8d8d3 (patch) | |
tree | 9cc24570bcc521efa7653573ea5eac21dd59fe34 | |
parent | d65b1d77fdef0c19ef451f82b234beb2491bb866 (diff) | |
download | gcc-5b770a964ade161bf7ae6cd9e2a0cfa55ad8d8d3.zip gcc-5b770a964ade161bf7ae6cd9e2a0cfa55ad8d8d3.tar.gz gcc-5b770a964ade161bf7ae6cd9e2a0cfa55ad8d8d3.tar.bz2 |
typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR and COND_EXPR specially; fix error message output.
* typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR
and COND_EXPR specially; fix error message output.
* testsuite/g++.dg/inherit/cond1.C: New test.
From-SVN: r56524
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/cond1.C | 10 |
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2933da8..cb95b6d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2002-08-22 Mark Mitchell <mark@codesourcery.com> + + * typeck.c (build_class_member_access_expr): Handle COMPOUND_EXPR + and COND_EXPR specially; fix error message output. + 2002-08-22 Jason Merrill <jason@redhat.com> * pt.c (tsubst_expr): RETURN_EXPR is now RETURN_STMT_EXPR. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index eaa79a0..624b379 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1859,6 +1859,27 @@ build_class_member_access_expr (tree object, tree member, my_friendly_assert (DECL_P (member) || BASELINK_P (member), 20020801); + /* Transform `(a, b).x' into `a, b.x' and `(a ? b : c).x' into + `a ? b.x : c.x'. These transformations should not really be + necessary, but they are. */ + if (TREE_CODE (object) == COMPOUND_EXPR) + { + result = build_class_member_access_expr (TREE_OPERAND (object, 1), + member, access_path, + preserve_reference); + return build (COMPOUND_EXPR, TREE_TYPE (result), + TREE_OPERAND (object, 0), result); + } + else if (TREE_CODE (object) == COND_EXPR) + return (build_conditional_expr + (TREE_OPERAND (object, 0), + build_class_member_access_expr (TREE_OPERAND (object, 1), + member, access_path, + preserve_reference), + build_class_member_access_expr (TREE_OPERAND (object, 2), + member, access_path, + preserve_reference))); + /* [expr.ref] The type of the first expression shall be "class object" (of a @@ -2135,7 +2156,7 @@ finish_class_member_access_expr (tree object, tree name) if (TREE_CODE (scope) == NAMESPACE_DECL) { error ("`%D::%D' is not a member of `%T'", - scope, member, object_type); + scope, name, object_type); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1fdf1bc..00a9213 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-08-22 Mark Mitchell <mark@codesourcery.com> + + * testsuite/g++.dg/inherit/cond1.C: New test. + 2002-08-22 Geoffrey Keating <geoffk@redhat.com> * gcc.dg/noncompile/incomplete-1.c: New test. diff --git a/gcc/testsuite/g++.dg/inherit/cond1.C b/gcc/testsuite/g++.dg/inherit/cond1.C new file mode 100644 index 0000000..843c72c --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/cond1.C @@ -0,0 +1,10 @@ +// Origin: jason@redhat.com +// { dg-do compile } + +struct A { A(); A(const A&); int i; }; +struct B: public A { }; + +int f (bool b, A& ar, B& br) +{ + return (b?ar:br).i; +} |