From: Argyrios Kyrtzidis Date: Mon, 6 Oct 2008 00:07:55 +0000 (+0000) Subject: Allow variadic arguments without named ones for C++, e.g. "void(...);" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e25d270b4d8e1d348bf74710c19b3c58d00933cb;p=clang Allow variadic arguments without named ones for C++, e.g. "void(...);" git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57143 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index c22d9e871b..3017da4821 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1233,6 +1233,7 @@ void Parser::ParseParenDeclarator(Declarator &D) { // paren, because we haven't seen the identifier yet. isGrouping = true; } else if (Tok.is(tok::r_paren) || // 'int()' is a function. + (getLang().CPlusPlus && Tok.is(tok::ellipsis)) || // C++ int(...) isDeclarationSpecifier()) { // 'int(int)' is a function. // This handles C99 6.7.5.3p11: in "typedef int X; void foo(X)", X is // considered to be a type, not a K&R identifier-list. @@ -1326,7 +1327,7 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D) { IsVariadic = true; // Check to see if this is "void(...)" which is not allowed. - if (ParamInfo.empty()) { + if (!getLang().CPlusPlus && ParamInfo.empty()) { // Otherwise, parse parameter type list. If it starts with an // ellipsis, diagnose the malformed function. Diag(Tok, diag::err_ellipsis_first_arg); diff --git a/test/Parser/cxx-variadic-func.cpp b/test/Parser/cxx-variadic-func.cpp new file mode 100644 index 0000000000..0ef8684c1a --- /dev/null +++ b/test/Parser/cxx-variadic-func.cpp @@ -0,0 +1,5 @@ +// RUN: clang -fsyntax-only %s + +void f(...) { + int g(int(...)); +}