]> granicus.if.org Git - clang/commitdiff
Patch for PR2350; the issue was tnat we were allowing (with an error)
authorEli Friedman <eli.friedman@gmail.com>
Thu, 22 May 2008 08:54:03 +0000 (08:54 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Thu, 22 May 2008 08:54:03 +0000 (08:54 +0000)
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

lib/Sema/SemaDecl.cpp
test/Sema/void_arg.c

index 35f12c7207bb156f5614c2fd89f980776fa5ba3d..38dbb9b09ac0c7ee4f3253933a728b70d8d72b65 100644 (file)
@@ -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);
         }
 
index 275a1c4864320f58aaf0f4acd98e307b71e5ad25..d0571fc4e1225b0ce84ff396c58673fde92e57ec 100644 (file)
@@ -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}}