Bug 431686

Summary: Error on template expansion with function with default argument
Product: [Fedora] Fedora Reporter: Horst H. von Brand <vonbrand>
Component: gccAssignee: Jakub Jelinek <jakub>
Status: CLOSED NOTABUG QA Contact: Fedora Extras Quality Assurance <extras-qa>
Severity: medium Docs Contact:
Priority: low    
Version: rawhideKeywords: Reopened
Target Milestone: ---   
Target Release: ---   
Hardware: i386   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2008-02-06 15:38:51 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Attachments:
Description Flags
A C++ file that shows the error
none
Another testcase none

Description Horst H. von Brand 2008-02-06 14:31:36 UTC
Description of problem:
Compiling the attached file gives an error with g++ 4.3, but the same worked
fine with 4.1. This is cut down from 

Version-Release number of selected component (if applicable):
gcc-c++-4.3.0-0.7.i386

How reproducible:
Always

Steps to Reproduce:
1. Compile the attached file
2.
3.
  
Actual results:
tst.cc: In function ‘void ff(int, T) [with T = void (*)(int, int)]’:
tst.cc:13:   instantiated from here
tst.cc:4: error: too few arguments to function

Expected results:
No error, realf() can be called with one or two arguments. AFAIU the default
value of the second argument is just a shorthand for an overload of the function.

Additional info:

Comment 1 Horst H. von Brand 2008-02-06 14:31:36 UTC
Created attachment 294106 [details]
A C++ file that shows the error

Comment 2 Jakub Jelinek 2008-02-06 14:51:50 UTC
That's a bug in the testcase.
See http://gcc.gnu.org/ml/gcc-patches/2007-07/msg01645.html and
http://gcc.gnu.org/PR32839

Comment 3 Horst H. von Brand 2008-02-06 15:26:34 UTC
I'm sorry, but that doesn't look right.

  int f(int i = 117);

has what type? int (*)() or int (*)(int)?

If I go:

  int f();
  int f(int);

what is the type of f? I'd say this is ambiguous, to say the least.

Besides, gcc-4.1 did do "the right thing", i.e., consider the first alternative
(which matches).

Comment 4 Horst H. von Brand 2008-02-06 15:28:01 UTC
Created attachment 294113 [details]
Another testcase

How come callf() gives an error, while the completely equivalent callg() goes
through?

Comment 5 Jakub Jelinek 2008-02-06 15:38:51 UTC
If you want to argue about this, do so upstream in the PR I referenced.
I'm not convinced you are right.

Comment 6 Horst H. von Brand 2008-02-06 17:00:43 UTC
Reported as 35106 on GCC's bugzilla