Scope *GlobalScope = FnBodyScope->getParent();
- // See if this is a redefinition.
- Decl *PrevDcl = LookupDecl(D.getIdentifier(), Decl::IDNS_Ordinary,
- GlobalScope);
- if (PrevDcl && isDeclInScope(PrevDcl, CurContext)) {
- if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PrevDcl)) {
- const FunctionDecl *Definition;
- if (FD->getBody(Definition)) {
- Diag(D.getIdentifierLoc(), diag::err_redefinition,
- D.getIdentifier()->getName());
- Diag(Definition->getLocation(), diag::err_previous_definition);
- }
- }
- }
-
return ActOnStartOfFunctionDef(FnBodyScope,
ActOnDeclarator(GlobalScope, D, 0));
}
Sema::DeclTy *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclTy *D) {
Decl *decl = static_cast<Decl*>(D);
FunctionDecl *FD = cast<FunctionDecl>(decl);
+
+ // See if this is a redefinition.
+ const FunctionDecl *Definition;
+ if (FD->getBody(Definition)) {
+ Diag(FD->getLocation(), diag::err_redefinition,
+ FD->getName());
+ Diag(Definition->getLocation(), diag::err_previous_definition);
+ }
+
PushDeclContext(FD);
// Check the validity of our function parameters
// PR2942
typedef void fn(int);
-fn f;
+fn f; // expected-error{{previous declaration is here}}
int g(int x, int y);
int g(int x, int y = 2);
typedef int g_type(int, int);
g_type g;
-int h(int x) {
+int h(int x) { // expected-error{{previous definition is here}}
return g(x);
}
+
+float f(int) { } // expected-error{{functions that differ only in their return type cannot be overloaded}}
+
+int h(int) { } // expected-error{{redefinition of 'h'}}
+