From 1e14c7f083611e88101a7842faeb89abdea2a2a8 Mon Sep 17 00:00:00 2001 From: Gabriel Dos Reis Date: Wed, 7 Aug 2002 00:38:00 +0000 Subject: [PATCH] typeck.c (build_x_unary_op): Handle pointer-to-member. cp/ * typeck.c (build_x_unary_op): Handle pointer-to-member. testsuite/ * g++.dg/README (Subdirectories): Document new subdir expr. * g++.dg/expr/pmf-1.C: New test. From-SVN: r56082 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/typeck.c | 19 +++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/README | 1 + gcc/testsuite/g++.dg/expr/pmf-1.C | 19 +++++++++++++++++++ 5 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/g++.dg/expr/pmf-1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ddadb9c87e2..60b6cb239dc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2002-08-06 Gabriel Dos Reis + + * typeck.c (build_x_unary_op): Handle pointer-to-member. + 2002-08-05 Geoffrey Keating * class.c: Don't include obstack.h. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 965f3f4399d..399005bc691 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -3794,6 +3794,25 @@ build_x_unary_op (code, xarg) } if (code == ADDR_EXPR) { + /* A pointer to member-function can be formed only by saying + &X::mf. */ + if (!flag_ms_extensions && TREE_CODE (TREE_TYPE (xarg)) == METHOD_TYPE + && (TREE_CODE (xarg) != OFFSET_REF || !PTRMEM_OK_P (xarg))) + { + if (TREE_CODE (xarg) != OFFSET_REF) + { + error ("invalid use of '%E' to form a pointer-to-member-function. Use a qualified-id.", + xarg); + return error_mark_node; + } + else + { + error ("parenthesis around '%E' cannot be used to form a pointer-to-member-function", + xarg); + PTRMEM_OK_P (xarg) = 1; + } + } + if (TREE_CODE (xarg) == OFFSET_REF) { ptrmem = PTRMEM_OK_P (xarg); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 55fd9a1aeb2..0acf870252b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-08-07 Gabriel Dos Reis + + * g++.dg/README (Subdirectories): Document new subdir expr. + * g++.dg/expr/pmf-1.C: New test. + 2002-08-06 Neil Booth * gcc.dg/cpp/vararg3.c, gcc.dg/cpp/vararg4.c: New tests. diff --git a/gcc/testsuite/g++.dg/README b/gcc/testsuite/g++.dg/README index edf1d5a38a5..073913f2056 100644 --- a/gcc/testsuite/g++.dg/README +++ b/gcc/testsuite/g++.dg/README @@ -2,6 +2,7 @@ Subdirectories: abi Tests for ABI compatibility -- mangling, object layout, etc. eh Tests for exception handling. +expr Tests for expressions. ext Tests for GNU language extensions. inherit Tests for inheritance -- virtual functions, multiple inheritance, etc. init Tests for initialization semantics, constructors/destructors, etc. diff --git a/gcc/testsuite/g++.dg/expr/pmf-1.C b/gcc/testsuite/g++.dg/expr/pmf-1.C new file mode 100644 index 00000000000..61457ecbdc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/expr/pmf-1.C @@ -0,0 +1,19 @@ +// C++ PR/2521 +// Copyright (C) 2002 Free Software Foundation +// Contributed by Gabriel Dos Reis + +// { dg-do compile } + +struct A +{ + void f(); + void foo(void (A::*)(int)); // { dg-error "candidate" "" } + template + void g(T); + void h() + { + void (A::*p)() = &A::f; + void (A::*q)() = &(A::f); // { dg-error "parenthesis" "" } + foo(&g); // { dg-error "" "" } + } +};