<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Issue 2099: Unnecessary constraints of va_start() usage</title>
<meta property="og:title" content="Issue 2099: Unnecessary constraints of va_start() usage">
<meta property="og:description" content="C++ library issue. Status: C++14">
<meta property="og:url" content="https://cplusplus.github.io/LWG/issue2099.html">
<meta property="og:type" content="website">
<meta property="og:image" content="http://cplusplus.github.io/LWG/images/cpp_logo.png">
<meta property="og:image:alt" content="C++ logo">
<style>
  p {text-align:justify}
  li {text-align:justify}
  pre code.backtick::before { content: "`" }
  pre code.backtick::after { content: "`" }
  blockquote.note
  {
    background-color:#E0E0E0;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 1px;
    padding-bottom: 1px;
  }
  ins {background-color:#A0FFA0}
  del {background-color:#FFA0A0}
  table.issues-index { border: 1px solid; border-collapse: collapse; }
  table.issues-index th { text-align: center; padding: 4px; border: 1px solid; }
  table.issues-index td { padding: 4px; border: 1px solid; }
  table.issues-index td:nth-child(1) { text-align: right; }
  table.issues-index td:nth-child(2) { text-align: left; }
  table.issues-index td:nth-child(3) { text-align: left; }
  table.issues-index td:nth-child(4) { text-align: left; }
  table.issues-index td:nth-child(5) { text-align: center; }
  table.issues-index td:nth-child(6) { text-align: center; }
  table.issues-index td:nth-child(7) { text-align: left; }
  table.issues-index td:nth-child(5) span.no-pr { color: red; }
  @media (prefers-color-scheme: dark) {
     html {
        color: #ddd;
        background-color: black;
     }
     ins {
        background-color: #225522
     }
     del {
        background-color: #662222
     }
     a {
        color: #6af
     }
     a:visited {
        color: #6af
     }
     blockquote.note
     {
        background-color: rgba(255, 255, 255, .10)
     }
  }
</style>
</head>
<body>
<hr>
<p><em>This page is a snapshot from the LWG issues list, see the <a href="lwg-active.html">Library Active Issues List</a> for more information and the meaning of <a href="lwg-active.html#C++14">C++14</a> status.</em></p>
<h3 id="2099"><a href="lwg-defects.html#2099">2099</a>. Unnecessary constraints of <code>va_start()</code> usage</h3>
<p><b>Section:</b> 17.14 <a href="https://wg21.link/support.runtime">[support.runtime]</a> <b>Status:</b> <a href="lwg-active.html#C++14">C++14</a>
 <b>Submitter:</b> Daniel Kr&uuml;gler <b>Opened:</b> 2011-11-12 <b>Last modified:</b> 2016-01-28</p>
<p><b>Priority: </b>Not Prioritized
</p>
<p><b>View all other</b> <a href="lwg-index.html#support.runtime">issues</a> in [support.runtime].</p>
<p><b>View all issues with</b> <a href="lwg-status.html#C++14">C++14</a> status.</p>
<p><b>Discussion:</b></p>

<p>
In 17.14 <a href="https://wg21.link/support.runtime">[support.runtime]</a> p3 we find (emphasis mine):
</p>
<blockquote><p>
The restrictions that ISO C places on the second parameter to the <code>va_start()</code> macro in header <code>&lt;stdarg.h&gt;</code>
are different in this International Standard. The parameter <code>parmN</code> is the identifier of the rightmost parameter
in the variable parameter list of the function definition (the one just before the ...).227 <em>If the parameter
<code>parmN</code> is <strong>declared</strong> with a <strong>function</strong>, <strong>array</strong></em>, or reference type, 
or with a type that is not compatible with the type that results when passing an argument for which there is no parameter, 
the behavior is undefined.
</p></blockquote>

<p>
It seems astonishing that the constraints on function types and array types imposes these 
on the <strong>declared</strong> parameter <code>parmN</code>, not to the adjusted one (which would
not require this extra wording, because that is implicit). This seems to say that a function 
definition of the form (Thanks to Johannes Schaub for this example)
</p>
<blockquote><pre>
#include &lt;stdarg.h&gt;

void f(char const paramN[], ...) {
  va_list ap;
  va_start(ap, paramN);
  va_end(ap);
}
</pre></blockquote>
<p>
would produce undefined behaviour when used.
<p/>
Similar wording exists in C99 and in the most recent C11 draft in 7.16.1.4 p4
<p/>
In my opinion the constraints in regard to array types and function types are
unnecessary and should be relaxed. Are there really implementations out in the 
wild that would (according to my understanding incorrectly) provide the declared and
not the adjusted type of <code>paramN</code> as deduced type to <code>va_start()</code>?
</p>


<p><i>[2012, Kona]</i></p>

<p>
Move to Ready.
</p>

<p><i>[2012, Portland: applied to WP]</i></p>




<p id="res-2099"><b>Proposed resolution:</b></p>
<p>This wording is relative to the FDIS.</p>

<p>Change 17.14 <a href="https://wg21.link/support.runtime">[support.runtime]</a> p3 as indicated:</p>
<blockquote><p>
The restrictions that ISO C places on the second parameter to the <code>va_start()</code> macro in header <code>&lt;stdarg.h&gt;</code>
are different in this International Standard. The parameter <code>parmN</code> is the identifier of the rightmost parameter
in the variable parameter list of the function definition (the one just before the ...).227 If the parameter
<code>parmN</code> is <del>declared with</del><ins>of</ins> a <del>function, array, or</del> reference type, or 
<del>with</del><ins>of</ins> a type that is not compatible with the type that results when passing an argument for 
which there is no parameter, the behavior is undefined.
</p></blockquote>






</body>
</html>
