diff options
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/README | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/expr/pmf-1.C | 19 |
5 files changed, 48 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ddadb9c..60b6cb2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2002-08-06 Gabriel Dos Reis <gdr@nerim.net> + + * typeck.c (build_x_unary_op): Handle pointer-to-member. + 2002-08-05 Geoffrey Keating <geoffk@redhat.com> * class.c: Don't include obstack.h. diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 965f3f4..399005b 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 55fd9a1..0acf870 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-08-07 Gabriel Dos Reis <gdr@nerim.net> + + * g++.dg/README (Subdirectories): Document new subdir expr. + * g++.dg/expr/pmf-1.C: New test. + 2002-08-06 Neil Booth <neil@daikokuya.co.uk> * 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 edf1d5a..073913f 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 0000000..61457ec --- /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 <gdr@integrable-solutions.net> + +// { dg-do compile } + +struct A +{ + void f(); + void foo(void (A::*)(int)); // { dg-error "candidate" "" } + template<typename T> + void g(T); + void h() + { + void (A::*p)() = &A::f; + void (A::*q)() = &(A::f); // { dg-error "parenthesis" "" } + foo(&g<int>); // { dg-error "" "" } + } +}; |