diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 898c13fef06..0af68ec773d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-05-14 Alexandre Oliva + + * pt.c (build_non_dependent_expr): Leave ADDR_EXPR of + COMPONENT_REF alone. + 2006-05-11 Volker Reichelt PR c++/27547 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4d34da477dd..c1530fb120f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12903,10 +12903,11 @@ build_non_dependent_expr (tree expr) return expr; /* Preserve OVERLOADs; the functions must be available to resolve types. */ - inner_expr = (TREE_CODE (expr) == ADDR_EXPR ? - TREE_OPERAND (expr, 0) : - TREE_CODE (expr) == COMPONENT_REF ? - TREE_OPERAND (expr, 1) : expr); + inner_expr = expr; + if (TREE_CODE (inner_expr) == ADDR_EXPR) + inner_expr = TREE_OPERAND (inner_expr, 0); + if (TREE_CODE (inner_expr) == COMPONENT_REF) + inner_expr = TREE_OPERAND (inner_expr, 1); if (is_overloaded_fn (inner_expr) || TREE_CODE (inner_expr) == OFFSET_REF) return expr; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 030c182f4e2..a2a2ae5edf4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-05-14 Alexandre Oliva + + * g++.dg/template/dependent-expr5.C: New test. + 2006-05-14 Roger Sayle PR middle-end/26729 diff --git a/gcc/testsuite/g++.dg/template/dependent-expr5.C b/gcc/testsuite/g++.dg/template/dependent-expr5.C new file mode 100644 index 00000000000..023f433da5d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/dependent-expr5.C @@ -0,0 +1,114 @@ +// { dg-do compile } + +// Copyright 2005 Free Software Foundation +// contributed by Alexandre Oliva +// inspired in the failure reported in Red Hat bugzilla #168260. + +template void bind(F f) {} + +template void bindm(F f) {} +template void bindm(F (T::*f)(void)) {} // { dg-error "note" } + +template void bindn(F f) {} +template void bindn(F (*f)(T)) {} + +template void bindb(F f) {} +template void bindb(F (*f)(T)) {} // { dg-error "note" } +template void bindb(F (T::*f)(void)) {} // { dg-error "note" } + +struct foo { + static int baist; + int bait; + void barf (); + static void barf (int); + + struct bar { + static int baikst; + int baikt; + void bark (); + static void bark (int); + + bar() { + bind (&baist); + bind (&foo::baist); + bind (&bait); // { dg-error "nonstatic data member" } + bind (&foo::bait); + + bind (&baikst); + bind (&bar::baikst); + bind (&baikt); // ok, this->baikt + bind (&bar::baikt); + + bind (&barf); // { dg-error "no matching function" } + bind (&foo::barf); // { dg-error "no matching function" } + + bindm (&barf); // { dg-error "no matching function" } + bindm (&foo::barf); + + bindn (&barf); + bindn (&foo::barf); + + bindb (&barf); + bindb (&foo::barf); // { dg-error "ambiguous" } + + bind (&bark); // { dg-error "no matching function" } + bind (&bar::bark); // { dg-error "no matching function" } + + bindm (&bark); // { dg-error "no matching function" } + bindm (&bar::bark); + + bindn (&bark); + bindn (&bar::bark); + + bindb (&bark); + bindb (&bar::bark); // { dg-error "ambiguous" } + } + }; + + template + struct barT { + static int baikst; + int baikt; + void bark (); + static void bark (int); + + barT() { + bind (&baist); + bind (&foo::baist); + bind (&bait); // { dg-error "nonstatic data member" } + bind (&foo::bait); + + bind (&baikst); + bind (&barT::baikst); + bind (&baikt); // ok, this->baikt + bind (&barT::baikt); + + bind (&barf); // { dg-error "no matching function" } + bind (&foo::barf); // { dg-error "no matching function" } + + bindm (&barf); // { dg-error "no matching function" } + bindm (&foo::barf); + + bindn (&barf); + bindn (&foo::barf); + + bindb (&barf); + bindb (&foo::barf); // { dg-error "ambiguous" } + + bind (&bark); // { dg-error "no matching function" } + bind (&barT::bark); // { dg-error "no matching function" } + + bindm (&bark); // { dg-error "no matching function" } + bindm (&barT::bark); + + bindn (&bark); + bindn (&barT::bark); + + bindb (&bark); + bindb (&barT::bark); // { dg-error "ambiguous" } + } + }; + + bar bard; + barT bart; +} bad;