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; }
"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")
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;
return f(1.);
}
-int x(int) {
+int x(int a) {
}
// rdar://6094870
-int test(int) {
+int test(int a) {
struct { int i; } x;
if (x.hello) // expected-error {{no member named 'hello'}}
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}}*/
void t10(){}
void t11(){t10(1);}
+// PR3208
+void t12(int) {} // expected-error{{parameter name omitted}}
+
// 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'}}