// Build don't link: // Copyright (C) 1999 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 5 Sep 1999 // [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. // excess errors test - XFAIL void ovl (int); // ERROR - candidate void ovl (float); // ERROR - candidate void fn (int); void fna (int); int main (int argc, char **argv) { void (*ptr) (int); void (*vptr) (); (ovl) (1); // ok (&ovl) (1); // ERROR - not suitable for overload resolution (ovl) (); // ERROR - no matching candidates (&ovl) (); // 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); // ERROR - not suitable for overload resolution (0, &ovl) (1); // ERROR - not suitable for overload resolution (argc ? ovl : ovl) (1); // ERROR - not suitable for overload resolution (argc ? &ovl : &ovl) (1); // 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 // 13.4 indicates these are ok. ptr = (0, ovl); // ok ptr = (0, &ovl); // ok ptr = (argc ? ovl : ovl); // ok ptr = (argc ? &ovl : &ovl);// ok vptr = (ovl); // ERROR - no matching candidates vptr = (&ovl); // ERROR - no matching candidates vptr = (0, ovl); // ERROR - no matching candidates vptr = (0, &ovl); // ERROR - no matching candidates vptr = (argc ? ovl : ovl); // ERROR - no matching candidates vptr = (argc ? &ovl : &ovl);// ERROR - no matching candidates ptr = (fn); ptr = (&fn); ptr = (0, fn); ptr = (0, &fn); ptr = (argc ? fna : fn); ptr = (argc ? &fna : &fn); f; // WARNING - not a call ovl; // ERROR - not suitable for overload &ovl; // ERROR - not suitable for overload (void)f; // ok (void)ovl; // ERROR - not suitable for overload (void)&ovl; // ERROR - not suitable for overload static_cast(f); // ok static_cast(ovl); // ERROR - not suitable for overload static_cast(&ovl); // ERROR - not suitable for overload ((void)1, f); // WARNING - not a call XFAIL ((void)1, ovl); // ERROR - not suitable for overload ((void)1, &ovl); // ERROR - not suitable for overload (void)((void)1, f); // ok (void)((void)1, ovl); // ERROR - not suitable for overload (void)((void)1, &ovl); // ERROR - not suitable for overload return 0; }