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 @@ -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) { diff --git a/clang/test/Sema/void-argument.cpp b/clang/test/Sema/void-argument.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Sema/void-argument.cpp @@ -0,0 +1,15 @@ +// RUN: not %clang_cc1 %s 2>&1 | FileCheck %s + +// CHECK: void-argument.cpp:9:6: error: 'void' must be the first and only parameter if specified +// CHECK: void-argument.cpp:12:7: error: 'void' must be the first and only parameter if specified +// CHECK: void-argument.cpp:14:6: error: 'void' must be the first and only parameter if specified +// CHECK: 3 errors generated. + +void foo ( +void a, +double b, +int c, +void d, +int e, +void f) +{}