Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -5109,7 +5109,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) { Index: clang/test/Sema/void-argument.cpp =================================================================== --- /dev/null +++ clang/test/Sema/void-argument.cpp @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +void foo( + 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}} +{} Index: clang/test/Sema/void-unnamed.cpp =================================================================== --- /dev/null +++ clang/test/Sema/void-unnamed.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +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}} +};