Commit c497db75 by Alexandre Oliva Committed by Alexandre Oliva

pt.c (build_non_dependent_expr): Leave ADDR_EXPR of COMPONENT_REF alone.

gcc/cp/ChangeLog:
* pt.c (build_non_dependent_expr): Leave ADDR_EXPR of
COMPONENT_REF alone.
gcc/testsuite/ChangeLog:
* g++.dg/template/dependent-expr5.C: New test.

From-SVN: r113765
parent faf32f4a
2006-05-14 Alexandre Oliva <aoliva@redhat.com>
* pt.c (build_non_dependent_expr): Leave ADDR_EXPR of
COMPONENT_REF alone.
2006-05-11 Volker Reichelt <reichelt@igpm.rwth-aachen.de> 2006-05-11 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/27547 PR c++/27547
......
...@@ -12903,10 +12903,11 @@ build_non_dependent_expr (tree expr) ...@@ -12903,10 +12903,11 @@ build_non_dependent_expr (tree expr)
return expr; return expr;
/* Preserve OVERLOADs; the functions must be available to resolve /* Preserve OVERLOADs; the functions must be available to resolve
types. */ types. */
inner_expr = (TREE_CODE (expr) == ADDR_EXPR ? inner_expr = expr;
TREE_OPERAND (expr, 0) : if (TREE_CODE (inner_expr) == ADDR_EXPR)
TREE_CODE (expr) == COMPONENT_REF ? inner_expr = TREE_OPERAND (inner_expr, 0);
TREE_OPERAND (expr, 1) : expr); if (TREE_CODE (inner_expr) == COMPONENT_REF)
inner_expr = TREE_OPERAND (inner_expr, 1);
if (is_overloaded_fn (inner_expr) if (is_overloaded_fn (inner_expr)
|| TREE_CODE (inner_expr) == OFFSET_REF) || TREE_CODE (inner_expr) == OFFSET_REF)
return expr; return expr;
......
2006-05-14 Alexandre Oliva <aoliva@redhat.com>
* g++.dg/template/dependent-expr5.C: New test.
2006-05-14 Roger Sayle <roger@eyesopen.com> 2006-05-14 Roger Sayle <roger@eyesopen.com>
PR middle-end/26729 PR middle-end/26729
// { dg-do compile }
// Copyright 2005 Free Software Foundation
// contributed by Alexandre Oliva <aoliva@redhat.com>
// inspired in the failure reported in Red Hat bugzilla #168260.
template<class F> void bind(F f) {}
template<class F> void bindm(F f) {}
template<class F, class T> void bindm(F (T::*f)(void)) {} // { dg-error "note" }
template<class F> void bindn(F f) {}
template<class F, class T> void bindn(F (*f)(T)) {}
template<class F> void bindb(F f) {}
template<class F, class T> void bindb(F (*f)(T)) {} // { dg-error "note" }
template<class F, class T> 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 <typename T>
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<void> bart;
} bad;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment