diff options
-rw-r--r-- | include/clang/Basic/DiagnosticParseKinds.td | 2 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 17 | ||||
-rw-r--r-- | test/Sema/function.c | 2 |
3 files changed, 20 insertions, 1 deletions
diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 9a042605bd..c018497907 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -136,6 +136,8 @@ def err_rvalue_reference : Error< def err_argument_required_after_attribute : Error< "argument required after attribute">; def err_missing_param : Error<"expected parameter declarator">; +def err_missing_comma_before_ellipsis : Error< + "C requires a comma prior to the ellipsis in a variadic function type">; def err_unexpected_typedef_ident : Error< "unexpected type name %0: expected identifier">; def err_expected_class_name : Error<"expected class name">; diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 4ca5b48e8b..75ff82772a 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -2448,6 +2448,7 @@ void Parser::ParseParenDeclarator(Declarator &D) { /// parameter-type-list: [C99 6.7.5] /// parameter-list /// parameter-list ',' '...' +/// [C++] parameter-list '...' /// /// parameter-list: [C99 6.7.5] /// parameter-declaration @@ -2647,7 +2648,21 @@ void Parser::ParseFunctionDeclarator(SourceLocation LParenLoc, Declarator &D, } // If the next token is a comma, consume it and keep reading arguments. - if (Tok.isNot(tok::comma)) break; + if (Tok.isNot(tok::comma)) { + if (Tok.is(tok::ellipsis)) { + IsVariadic = true; + EllipsisLoc = ConsumeToken(); // Consume the ellipsis. + + if (!getLang().CPlusPlus) { + // We have ellipsis without a preceding ',', which is ill-formed + // in C. Complain and provide the fix. + Diag(EllipsisLoc, diag::err_missing_comma_before_ellipsis) + << CodeModificationHint::CreateInsertion(EllipsisLoc, ", "); + } + } + + break; + } // Consume the comma. ConsumeToken(); diff --git a/test/Sema/function.c b/test/Sema/function.c index c9d8630c47..e7a37f1a2f 100644 --- a/test/Sema/function.c +++ b/test/Sema/function.c @@ -87,3 +87,5 @@ unknown_type t19(int* P) { // expected-error {{unknown type name 'unknown_type P = P+1; // no warning. } +// missing ',' before '...' +void t20(int i...) { } // expected-error {{requires a comma}} |