]> granicus.if.org Git - clang/commitdiff
diagnose C99 6.9.1p5, C arguments in definitions that are lacking
authorChris Lattner <sabre@nondot.org>
Wed, 17 Dec 2008 07:32:46 +0000 (07:32 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 17 Dec 2008 07:32:46 +0000 (07:32 +0000)
a name.  This implements PR3208.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61127 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Decl.h
include/clang/Basic/DiagnosticKinds.def
lib/Sema/SemaDecl.cpp
test/CodeGen/rdr-6140807-alias-references-forward.c
test/Parser/recovery.c
test/Sema/c89.c
test/Sema/function.c
test/Sema/redefinition.c

index 8d6cdcb69604b4362019315adbefa6dbfa705094..57b967ec680185d2c47d7580048ea0552e6d0ab1 100644 (file)
@@ -484,8 +484,9 @@ public:
   ObjCDeclQualifier getObjCDeclQualifier() const {
     return ObjCDeclQualifier(objcDeclQualifier);
   }
-  void setObjCDeclQualifier(ObjCDeclQualifier QTVal) 
-  { objcDeclQualifier = QTVal; }
+  void setObjCDeclQualifier(ObjCDeclQualifier QTVal) {
+    objcDeclQualifier = QTVal;
+  }
     
   const Expr *getDefaultArg() const { return DefaultArg; }
   Expr *getDefaultArg() { return DefaultArg; }
index b379ab2f02025a63d416773277048921d6a9acae..42ce6c7a9f129500b3b7ea3b80247f3e53b1639e 100644 (file)
@@ -720,6 +720,8 @@ DIAG(err_missing_param, ERROR,
      "expected parameter declarator")
 DIAG(err_bad_variable_name, ERROR,
      "'%0' cannot be the name of a variable or data member")
+DIAG(err_parameter_name_omitted, ERROR,
+     "parameter name omitted")
 
 DIAG(err_declarator_need_ident, ERROR,
      "declarator requires an identifier")
index 424ce7f845ab84744a8a94d7c3d73019d5ef925f..6ef9ecd81728f4b71761e9ce8da13ffd14df1fc7 100644 (file)
@@ -720,6 +720,11 @@ bool Sema::CheckParmsForFunctionDef(FunctionDecl *FD) {
       Param->setInvalidDecl();
       HasInvalidParm = true;
     }
+    
+    // C99 6.9.1p5: If the declarator includes a parameter type list, the
+    // declaration of each parameter shall include an identifier.
+    if (Param->getIdentifier() == 0 && !getLangOptions().CPlusPlus)
+      Diag(Param->getLocation(), diag::err_parameter_name_omitted);
   }
 
   return HasInvalidParm;
index eff69aca2d2f9cceb28c3c1512be75ec31b5d742..5fe15d177ddde3a25dab982affbc0f39ea519fba 100644 (file)
@@ -10,5 +10,5 @@ int y() {
   return f(1.);
 }
 
-int x(int) {
+int x(int a) {
 }
index f77b570638264983e5555e850b50ae82911adff7..78addb90e492c6d5d9ac2233dafbe219476bb5ef 100644 (file)
@@ -20,7 +20,7 @@ static char *f (char * (*g) (char **, int), char **p, ...) {
 
 
 // rdar://6094870
-int test(int) {
+int test(int a) {
   struct { int i; } x;
   
   if (x.hello)   // expected-error {{no member named 'hello'}}
index 70949f0c82dc9d2a4ae73e94042438bbdf26e36c..b1780e916102440950e82088b7b09029eddbcaa8 100644 (file)
@@ -44,7 +44,8 @@ test7;  /* expected-warning {{declaration specifier missing, defaulting to 'int'
 void test8(int, x);  /* expected-warning {{declaration specifier missing, defaulting to 'int'}} */
 
 typedef int sometype;
-int a(sometype, y) {return 0;}  /* expected-warning {{declaration specifier missing, defaulting to 'int'}} */
+int a(sometype, y) {return 0;}  /* expected-warning {{declaration specifier missing, defaulting to 'int'}} \
+                                   expected-error {{parameter name omitted}}*/
 
 
 
index 7c67bbaa63370c835f0771279722dc7bf2740159..f2aa8d92162d298424da564910744117908cff2f 100644 (file)
@@ -29,3 +29,6 @@ int t9(int a, );  // expected-error {{expected parameter declarator}}
 void t10(){}
 void t11(){t10(1);}
 
+// PR3208
+void t12(int) {}  // expected-error{{parameter name omitted}}
+
index 9ad77f61a732bc30be49f074713f6c8901e1ccaa..5e7907062311c7f80f55b14bf6daf7f293bf19ea 100644 (file)
@@ -1,5 +1,5 @@
 // RUN: clang %s -fsyntax-only -verify
-int f(int) { } // expected-note {{previous definition is here}}
+int f(int a) { } // expected-note {{previous definition is here}}
 int f(int);
-int f(int) { } // expected-error {{redefinition of 'f'}}
+int f(int a) { } // expected-error {{redefinition of 'f'}}