111
|
1 // { dg-do compile }
|
|
2
|
|
3 // Copyright 2005 Free Software Foundation
|
|
4 // contributed by Alexandre Oliva <aoliva@redhat.com>
|
|
5 // inspired in the failure reported in Red Hat bugzilla #168260.
|
|
6
|
|
7 template<class F> void bind(F f) {} // { dg-message "note" }
|
|
8
|
|
9 template<class F> void bindm(F f) {} // { dg-message "note" }
|
|
10 template<class F, class T> void bindm(F (T::*f)(void)) {} // { dg-message "note" }
|
|
11
|
|
12 template<class F> void bindn(F f) {}
|
|
13 template<class F, class T> void bindn(F (*f)(T)) {}
|
|
14
|
|
15 template<class F> void bindb(F f) {}
|
|
16 template<class F, class T> void bindb(F (*f)(T)) {} // { dg-message "note" }
|
|
17 template<class F, class T> void bindb(F (T::*f)(void)) {} // { dg-message "note" }
|
|
18
|
|
19 struct foo {
|
|
20 static int baist;
|
|
21 int bait; // { dg-message "" }
|
|
22 void barf ();
|
|
23 static void barf (int);
|
|
24
|
|
25 struct bar {
|
|
26 static int baikst;
|
|
27 int baikt;
|
|
28 void bark ();
|
|
29 static void bark (int);
|
|
30
|
|
31 bar() {
|
|
32 bind (&baist);
|
|
33 bind (&foo::baist);
|
|
34 bind (&bait); // { dg-error "non-static data member" }
|
|
35 bind (&foo::bait);
|
|
36
|
|
37 bind (&baikst);
|
|
38 bind (&bar::baikst);
|
|
39 bind (&baikt); // ok, this->baikt
|
|
40 bind (&bar::baikt);
|
|
41
|
|
42 bind (&barf); // { dg-error "no matching function" }
|
|
43 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
44 bind (&foo::barf); // { dg-error "no matching function" }
|
|
45 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
46
|
|
47 bindm (&barf); // { dg-error "no matching function" }
|
|
48 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
49 bindm (&foo::barf);
|
|
50
|
|
51 bindn (&barf);
|
|
52 bindn (&foo::barf);
|
|
53
|
|
54 bindb (&barf);
|
|
55 bindb (&foo::barf); // { dg-error "ambiguous" }
|
|
56
|
|
57
|
|
58 bind (&bark); // { dg-error "no matching function" }
|
|
59 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
60 bind (&bar::bark); // { dg-error "no matching function" }
|
|
61 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
62
|
|
63 bindm (&bark); // { dg-error "no matching function" }
|
|
64 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
65 bindm (&bar::bark);
|
|
66
|
|
67 bindn (&bark);
|
|
68 bindn (&bar::bark);
|
|
69
|
|
70 bindb (&bark);
|
|
71 bindb (&bar::bark); // { dg-error "ambiguous" }
|
|
72
|
|
73 }
|
|
74 };
|
|
75
|
|
76 template <typename T>
|
|
77 struct barT {
|
|
78 static int baikst;
|
|
79 int baikt;
|
|
80 void bark ();
|
|
81 static void bark (int);
|
|
82
|
|
83 barT() {
|
|
84 bind (&baist);
|
|
85 bind (&foo::baist);
|
|
86 bind (&bait); // { dg-error "non-static data member" }
|
|
87 bind (&foo::bait);
|
|
88
|
|
89 bind (&baikst);
|
|
90 bind (&barT::baikst);
|
|
91 bind (&baikt); // ok, this->baikt
|
|
92 bind (&barT::baikt);
|
|
93
|
|
94 bind (&barf); // { dg-error "no matching function" }
|
|
95 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
96 bind (&foo::barf); // { dg-error "no matching function" }
|
|
97 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
98
|
|
99 bindm (&barf); // { dg-error "no matching function" }
|
|
100 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
101 bindm (&foo::barf);
|
|
102
|
|
103 bindn (&barf);
|
|
104 bindn (&foo::barf);
|
|
105
|
|
106 bindb (&barf);
|
|
107 bindb (&foo::barf); // { dg-error "ambiguous" }
|
|
108
|
|
109
|
|
110 bind (&bark); // { dg-error "no matching function" }
|
|
111 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
112 bind (&barT::bark); // { dg-error "no matching function" }
|
|
113 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
114
|
|
115 bindm (&bark); // { dg-error "no matching function" }
|
|
116 // { dg-message "(candidate|deduce template parameter)" "candidate note" { target *-*-* } .-1 }
|
|
117 bindm (&barT::bark);
|
|
118
|
|
119 bindn (&bark);
|
|
120 bindn (&barT::bark);
|
|
121
|
|
122 bindb (&bark);
|
|
123 bindb (&barT::bark); // { dg-error "ambiguous" }
|
|
124
|
|
125 }
|
|
126 };
|
|
127
|
|
128 bar bard;
|
|
129 barT<void> bart;
|
|
130 } bad;
|