summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2008-01-16 15:01:34 +0000
committerSteve Naroff <snaroff@apple.com>2008-01-16 15:01:34 +0000
commit17832a48f8d8b0724760c34225834dceb4e5e951 (patch)
treeb375757f44aa77e6aaa237024e6a784473fd6b2a /clang
parent7ca4d5b1f304bb0f20ca444f22c8a75a0ba03467 (diff)
downloadbcm5719-llvm-17832a48f8d8b0724760c34225834dceb4e5e951.tar.gz
bcm5719-llvm-17832a48f8d8b0724760c34225834dceb4e5e951.zip
Sema::MergeFunctionDecl()...make sure diagnostic is accurate (wrt function declarations/definitions). Patch by Carl Lewis!
llvm-svn: 46070
Diffstat (limited to 'clang')
-rw-r--r--clang/Sema/SemaDecl.cpp9
-rw-r--r--clang/include/clang/Basic/DiagnosticKinds.def2
-rw-r--r--clang/test/Sema/merge-decls.c4
-rw-r--r--clang/test/Sema/predefined-function.c14
4 files changed, 18 insertions, 11 deletions
diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp
index ddfde8f44de..9e6dbfe3334 100644
--- a/clang/Sema/SemaDecl.cpp
+++ b/clang/Sema/SemaDecl.cpp
@@ -251,11 +251,16 @@ FunctionDecl *Sema::MergeFunctionDecl(FunctionDecl *New, ScopedDecl *OldD) {
if (Context.functionTypesAreCompatible(OldQType, NewQType))
return New;
+ // A function that has already been declared has been redeclared or defined
+ // with a different type- show appropriate diagnostic
+ diag::kind PrevDiag = Old->getBody() ? diag::err_previous_definition :
+ diag::err_previous_declaration;
+
// TODO: CHECK FOR CONFLICTS, multiple decls with same name in one scope.
// TODO: This is totally simplistic. It should handle merging functions
// together etc, merging extern int X; int X; ...
- Diag(New->getLocation(), diag::err_redefinition, New->getName());
- Diag(Old->getLocation(), diag::err_previous_definition);
+ Diag(New->getLocation(), diag::err_conflicting_types, New->getName());
+ Diag(Old->getLocation(), PrevDiag);
return New;
}
diff --git a/clang/include/clang/Basic/DiagnosticKinds.def b/clang/include/clang/Basic/DiagnosticKinds.def
index ea6da368cdb..50815ec2163 100644
--- a/clang/include/clang/Basic/DiagnosticKinds.def
+++ b/clang/include/clang/Basic/DiagnosticKinds.def
@@ -598,6 +598,8 @@ DIAG(err_redefinition, ERROR,
"redefinition of '%0'")
DIAG(err_redefinition_different_kind, ERROR,
"redefinition of '%0' as different kind of symbol")
+DIAG(err_conflicting_types, ERROR,
+ "conflicting types for '%0'")
DIAG(err_nested_redefinition, ERROR,
"nested redefinition of '%0'")
DIAG(err_use_with_wrong_tag, ERROR,
diff --git a/clang/test/Sema/merge-decls.c b/clang/test/Sema/merge-decls.c
index 22026e7f258..50ce4787699 100644
--- a/clang/test/Sema/merge-decls.c
+++ b/clang/test/Sema/merge-decls.c
@@ -3,9 +3,9 @@
void foo(void);
void foo(void) {}
void foo(void);
-void foo(void); // expected-error{{previous definition is here}}
+void foo(void); // expected-error{{previous declaration is here}}
-void foo(int); // expected-error {{redefinition of 'foo'}}
+void foo(int); // expected-error {{conflicting types for 'foo'}}
int funcdef()
{
diff --git a/clang/test/Sema/predefined-function.c b/clang/test/Sema/predefined-function.c
index d554b8faa89..1dcd1d38a28 100644
--- a/clang/test/Sema/predefined-function.c
+++ b/clang/test/Sema/predefined-function.c
@@ -4,13 +4,13 @@ char *funk(int format);
enum Test {A=-1};
char *funk(enum Test x);
-int eli(float b); // expected-error {{previous definition is here}}
+int eli(float b); // expected-error {{previous declaration is here}}
int b(int c) {return 1;}
int foo();
int foo()
{
- int eli(int (int)); // expected-error {{redefinition of 'eli'}}
+ int eli(int (int)); // expected-error {{conflicting types for 'eli'}}
eli(b);
return 0;
}
@@ -20,19 +20,19 @@ int bar(int i) // expected-error {{previous definition is here}}
{
return 0;
}
-int bar() // expected-error {{redefinition of 'bar'}}
+int bar() // expected-error {{redefinition of 'bar'}} expected-error {{conflicting types for 'bar'}}
{
return 0;
}
-int foobar(int); // expected-error {{previous definition is here}}
-int foobar() // expected-error {{redefinition of 'foobar'}}
+int foobar(int); // expected-error {{previous declaration is here}}
+int foobar() // expected-error {{conflicting types for 'foobar'}}
{
return 0;
}
-int wibble(); // expected-error {{previous definition is here}}
-float wibble() // expected-error {{redefinition of 'wibble'}}
+int wibble(); // expected-error {{previous declaration is here}}
+float wibble() // expected-error {{conflicting types for 'wibble'}}
{
return 0.0f;
}
OpenPOWER on IntegriCloud