<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - incorrect determination of compatible function types"
   href="http://llvm.org/bugs/show_bug.cgi?id=20313">20313</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>incorrect determination of compatible function types
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>clang
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>3.4
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>Macintosh
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>MacOS X
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Frontend
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedclangbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>siegel@udel.edu
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Consider the following C program:

    int f() { return 9; }
    int main() {
      int (*h1)(int);
      h1 = f; // why is this allowed?                                           
      return h1(7);
    }

According to the C11 Standard, Sec. 6.5.16.1, in a simple assignment, "one of
the following shall hold", and the only relevant one in the list is the
following:

"the left operand has atomic, qualified, or unqualified pointer type, and ...
both operands are pointers to qualified or unqualified versions of compatible
types..."

Moreover, this is a "constraint", meaning, a conforming implementation must
report a diagnostic message if it is violated.

It seems to me that this constraint is violated in the assignment in the
program above.  Both sides of the assignments are function pointers.  So the
question is, are the two function types compatible?  This is answered in Sec.
6.7.6.3:

"For two function types to be compatible, both shall specify compatible return
types.... If one type has a parameter type list and the other type is specified
by a function definition that contains a (possibly empty) identifier list, both
shall agree in the number of parameters, and the type of each prototype
parameter shall be compatible with the type that results from the application
of the default argument promotions to the type of the corresponding
identifier."

In this case, one of the types, that of h1, has a parameter type list; the
other, f, does not.  Hence the last sentence in the quote above applies: in
particular, "both shall agree in the number of parameters".  Clearly h1 takes
one parameter.   What about f?  The following point occurs in the C11 Standard
just before the one quoted above:

"An empty list in a function declarator that is part of a definition of that
function specifies that the function has no parameters."

So f takes 0 parameters.  So the two types do not agree in the number of
parameters, the two functions types are incompatible, and the assignment
violates a constraint, and a diagnostic should be issued.

However Clang/LLVM issues no diagnostic message when compiling the program:

    tmp$ cc -std=c11 -Wall tmp4.c 
    tmp$

See also:
<a href="http://stackoverflow.com/questions/24743887/are-these-compatible-function-types-in-c">http://stackoverflow.com/questions/24743887/are-these-compatible-function-types-in-c</a></pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>