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. llvm-svn: 51424
This commit is contained in:
parent
b90b3728a7
commit
bb5de96bc8
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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}}
|
||||
|
|
Loading…
Reference in New Issue