// Build don't link:

// 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.

// 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<void>(f);          // ok
  static_cast<void>(ovl);        // ERROR - not suitable for overload
  static_cast<void>(&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;
}
