From: Eli Friedman Date: Thu, 22 May 2008 08:54:03 +0000 (+0000) Subject: Patch for PR2350; the issue was tnat we were allowing (with an error) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6d1e4b5e7e80228a1f892824c405ba6a1c3c89b6;p=clang Patch for PR2350; the issue was tnat we were allowing (with an error) void f(const void) in one place and rejecting it in another. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51424 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 35f12c7207..38dbb9b09a 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -878,9 +878,10 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) { // Check for C99 6.7.5.3p10 - foo(void) is a non-varargs // function that takes no arguments, not a function that takes a // single void argument. + // We let through "const void" here because Sema::GetTypeForDeclarator + // already checks for that case. if (FTI.NumArgs == 1 && !FTI.isVariadic && FTI.ArgInfo[0].Ident == 0 && FTI.ArgInfo[0].Param && - !((ParmVarDecl*)FTI.ArgInfo[0].Param)->getType().getCVRQualifiers() && ((ParmVarDecl*)FTI.ArgInfo[0].Param)->getType()->isVoidType()) { // empty arg list, don't push any params. ParmVarDecl *Param = (ParmVarDecl*)FTI.ArgInfo[0].Param; @@ -888,7 +889,7 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) { // In C++, the empty parameter-type-list must be spelled "void"; a // typedef of void is not permitted. if (getLangOptions().CPlusPlus && - Param->getType() != Context.VoidTy) { + Param->getType().getUnqualifiedType() != Context.VoidTy) { Diag(Param->getLocation(), diag::ext_param_typedef_of_void); } diff --git a/test/Sema/void_arg.c b/test/Sema/void_arg.c index 275a1c4864..d0571fc4e1 100644 --- a/test/Sema/void_arg.c +++ b/test/Sema/void_arg.c @@ -1,4 +1,4 @@ -/* RUN: clang -fsyntax-only %s 2>&1 | grep '6 diagnostics' +/* RUN: clang -fsyntax-only %s -verify */ typedef void Void; @@ -6,13 +6,13 @@ typedef void Void; void foo() { int X; - X = sizeof(int (void a)); - X = sizeof(int (int, void)); - X = sizeof(int (void, ...)); + X = sizeof(int (void a)); // expected-error {{argument may not have 'void' type}} + X = sizeof(int (int, void)); // expected-error {{must be the first and only parameter}} + X = sizeof(int (void, ...)); // expected-error {{must be the first and only parameter}} - X = sizeof(int (Void a)); - X = sizeof(int (int, Void)); - X = sizeof(int (Void, ...)); + X = sizeof(int (Void a)); // expected-error {{argument may not have 'void' type}} + X = sizeof(int (int, Void)); // expected-error {{must be the first and only parameter}} + X = sizeof(int (Void, ...)); // expected-error {{must be the first and only parameter}} // Accept these. X = sizeof(int (void)); @@ -23,3 +23,4 @@ void foo() { void bar(Void) { } +void f(const void); // expected-error {{parameter must not have type qualifiers}}