diff options
| author | Steve Naroff <snaroff@apple.com> | 2008-01-16 15:01:34 +0000 |
|---|---|---|
| committer | Steve Naroff <snaroff@apple.com> | 2008-01-16 15:01:34 +0000 |
| commit | 17832a48f8d8b0724760c34225834dceb4e5e951 (patch) | |
| tree | b375757f44aa77e6aaa237024e6a784473fd6b2a /clang | |
| parent | 7ca4d5b1f304bb0f20ca444f22c8a75a0ba03467 (diff) | |
| download | bcm5719-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.cpp | 9 | ||||
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticKinds.def | 2 | ||||
| -rw-r--r-- | clang/test/Sema/merge-decls.c | 4 | ||||
| -rw-r--r-- | clang/test/Sema/predefined-function.c | 14 |
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; } |

