<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 --- - No warning on passing a parameter with register storage to va_start, which is undefined behavior"
   href="http://llvm.org/bugs/show_bug.cgi?id=18903">18903</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>No warning on passing a parameter with register storage to va_start, which is undefined behavior
          </td>
        </tr>

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

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </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>chengniansun@gmail.com
          </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>Based on the C11 standard, (section 7.16.1.4)
The parameter parmN is the identifier of the rightmost parameter in the
variable
parameter list in the function definition (the one just before the , ...). If
the parameter parmN is declared with the register storage class, with a
function or array type, or with a type that is not compatible with the type
that results after application of the default argument promotions, the behavior
is undefined.

Currently clang does not warn on this behavior. I think it would be interesting
to add this support. 

$: cat s.c 
#include <stdarg.h>
void f(register int x, ...) {
  va_list ap;
  va_start(ap, x);
  va_end(ap);
}
$: clang-trunk -Wvarargs -c s.c 
$: gcc-trunk -Wvarargs -c s.c 
s.c: In function ‘f’:
s.c:4:3: warning: undefined behaviour when second parameter of ‘va_start’ is
declared with ‘register’ storage [-Wvarargs]
   va_start(ap, x);
   ^
$: clang-trunk --version
clang version 3.5 (trunk 201498)
Target: x86_64-unknown-linux-gnu
Thread model: posix
$:</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>