diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -5114,7 +5114,7 @@ // is an incomplete type (C99 6.2.5p19) and function decls cannot // have parameters of incomplete type. if (FTI.NumParams != 1 || FTI.isVariadic) { - S.Diag(DeclType.Loc, diag::err_void_only_param); + S.Diag(FTI.Params[i].IdentLoc, diag::err_void_only_param); ParamTy = Context.IntTy; Param->setType(ParamTy); } else if (FTI.Params[i].Ident) { diff --git a/clang/test/SemaCXX/void-argument.cpp b/clang/test/SemaCXX/void-argument.cpp new file mode 100644 --- /dev/null +++ b/clang/test/SemaCXX/void-argument.cpp @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +void fun( + void a, // expected-error{{'void' must be the first and only parameter if specified}} + double b, + int c, + void d, // expected-error{{'void' must be the first and only parameter if specified}} + int e, + void f) // expected-error{{'void' must be the first and only parameter if specified}} +{} + +void foo( + int a, + void, // expected-error{{'void' must be the first and only parameter if specified}} + int b); + +void bar( + void, // expected-error{{'void' must be the first and only parameter if specified}} + ...); + +struct S { + S( + void, // expected-error{{'void' must be the first and only parameter if specified}} + void); // expected-error{{'void' must be the first and only parameter if specified}} +};