forked from OSchip/llvm-project
[Sema] Implement DR777
A parameter pack after a default argument is now valid. PR23029. llvm-svn: 233377
This commit is contained in:
parent
3b8044c02d
commit
fe25759022
|
@ -697,16 +697,16 @@ void Sema::CheckCXXDefaultArguments(FunctionDecl *FD) {
|
|||
break;
|
||||
}
|
||||
|
||||
// C++ [dcl.fct.default]p4:
|
||||
// In a given function declaration, all parameters
|
||||
// subsequent to a parameter with a default argument shall
|
||||
// have default arguments supplied in this or previous
|
||||
// declarations. A default argument shall not be redefined
|
||||
// by a later declaration (not even to the same value).
|
||||
// C++11 [dcl.fct.default]p4:
|
||||
// In a given function declaration, each parameter subsequent to a parameter
|
||||
// with a default argument shall have a default argument supplied in this or
|
||||
// a previous declaration or shall be a function parameter pack. A default
|
||||
// argument shall not be redefined by a later declaration (not even to the
|
||||
// same value).
|
||||
unsigned LastMissingDefaultArg = 0;
|
||||
for (; p < NumParams; ++p) {
|
||||
ParmVarDecl *Param = FD->getParamDecl(p);
|
||||
if (!Param->hasDefaultArg()) {
|
||||
if (!Param->hasDefaultArg() && !Param->isParameterPack()) {
|
||||
if (Param->isInvalidDecl())
|
||||
/* We already complained about this parameter. */;
|
||||
else if (Param->getIdentifier())
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
// RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
||||
// RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
||||
// RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
||||
// RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
|
||||
|
||||
namespace dr777 { // dr777: yes
|
||||
#if __cplusplus >= 201103L
|
||||
template <typename... T>
|
||||
void f(int i = 0, T ...args) {}
|
||||
void ff() { f(); }
|
||||
|
||||
template <typename... T>
|
||||
void g(int i = 0, T ...args, T ...args2) {}
|
||||
|
||||
template <typename... T>
|
||||
void h(int i = 0, T ...args, int j = 1) {}
|
||||
#endif
|
||||
}
|
||||
|
||||
// expected-no-diagnostics
|
|
@ -4681,7 +4681,7 @@ and <I>POD class</I></td>
|
|||
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#777">777</a></td>
|
||||
<td>CD2</td>
|
||||
<td>Default arguments and parameter packs</td>
|
||||
<td class="none" align="center">Unknown</td>
|
||||
<td class="full" align="center">Yes</td>
|
||||
</tr>
|
||||
<tr id="778">
|
||||
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#778">778</a></td>
|
||||
|
|
Loading…
Reference in New Issue