1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
// { dg-do assemble }
// Copyright (C) 1999 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 5 Sep 1999 <nathan@acm.org>
// [over.match] 13.3 tells us where overload resolution occurs.
// [over.match.call] 13.3.1.1 says that in
// (...( postfix-expression )...) (expression-list)
// the postfix-expression must be the name of a function (amongst some other
// choices). This means comma and conditional exprs cannot be placed there.
// This clause is the only one I can find which bans
// (cond ? fna : fnb) (arglist)
// which would be a major headache to have to implement.
// [over.over] 13.4 tells us when the use of a function name w/o arguments is
// resolved to the address of a particular function. These are determined by
// the context of the function name, and it does allow more complicated primary
// expressions.
// Using a naked function name is rather strange, we used to warn about it
// (rather inconsistently), but subsequent changes broke the warning. Make
// sure that doesn't happen again.
void ovl (int); // { dg-message "ovl|candidate expects" } candidate
void ovl (float); // { dg-message "ovl|candidate expects" } candidate
void fn (int);
void fna (int);
int main (int argc, char **argv)
{
void (*ptr) (int);
void (*vptr) ();
(ovl) (1); // ok
(&ovl) (1); // { dg-error "" } not suitable for overload resolution
(ovl) (); // { dg-error "" } no matching candidates
// { dg-message "candidate" "candidate note" { target *-*-* } 36 }
(&ovl) (); // { dg-error "" } not suitable for overload resolution
// 13.3.1.1 indicates that the following are errors -- the primary expression
// is not the name of a function.
(0, ovl) (1); // { dg-error "" } not suitable for overload resolution
(0, &ovl) (1); // { dg-error "" } not suitable for overload resolution
(argc ? ovl : ovl) (1); // { dg-error "" } not suitable for overload resolution
(argc ? &ovl : &ovl) (1); // { dg-error "" } not suitable for overload resolution
(fn) (1); // ok
(&fn) (1); // ok (no overload resolution)
(0, fn) (1); // ok (no overload resolution)
(0, &fn) (1); // ok (no overload resolution)
(argc ? fna : fn) (1); // ok (no overload resolution)
(argc ? &fna : &fn) (1); // ok (no overload resolution)
ptr = (ovl); // ok
ptr = (&ovl); // ok
ptr = (0, ovl); // ok { dg-error "no context" }
ptr = (0, &ovl); // ok { dg-error "no context" }
ptr = (argc ? ovl : ovl); // ok { dg-error "no context" }
ptr = (argc ? &ovl : &ovl);// ok { dg-error "no context" }
vptr = (ovl); // { dg-error "" } no matching candidates
vptr = (&ovl); // { dg-error "" } no matching candidates
vptr = (0, ovl); // { dg-error "" } no matching candidates
vptr = (0, &ovl); // { dg-error "" } no matching candidates
vptr = (argc ? ovl : ovl); // { dg-error "" } no matching candidates
vptr = (argc ? &ovl : &ovl);// { dg-error "" } no matching candidates
ptr = (fn);
ptr = (&fn);
ptr = (0, fn);
ptr = (0, &fn);
ptr = (argc ? fna : fn);
ptr = (argc ? &fna : &fn);
f; // { dg-error "" } not a call
ovl; // { dg-error "" } not suitable for overload
&ovl; // { dg-error "" } not suitable for overload
(void)f; // ok
(void)ovl; // { dg-error "" } not suitable for overload
(void)&ovl; // { dg-error "" } not suitable for overload
static_cast<void>(f); // ok
static_cast<void>(ovl); // { dg-error "" } not suitable for overload
static_cast<void>(&ovl); // { dg-error "" } not suitable for overload
((void)1, f); // { dg-warning "" "" { xfail *-*-* } } not a call
((void)1, ovl); // { dg-error "" } not suitable for overload
((void)1, &ovl); // { dg-error "" } not suitable for overload
(void)((void)1, f); // ok
(void)((void)1, ovl); // { dg-error "" } not suitable for overload
(void)((void)1, &ovl); // { dg-error "" } not suitable for overload
return 0;
}
|