]> granicus.if.org Git - clang/commitdiff
Handle the obvious case for diagnosing redeclarations of extern "C" functions.
authorJohn McCall <rjmccall@apple.com>
Thu, 12 Aug 2010 07:09:11 +0000 (07:09 +0000)
committerJohn McCall <rjmccall@apple.com>
Thu, 12 Aug 2010 07:09:11 +0000 (07:09 +0000)
Fixes PR7859.

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

lib/Sema/SemaOverload.cpp
test/SemaCXX/linkage-spec.cpp

index 339a79384c2ac796095e790c96cdf2921ee49ed8..047a5d9ba58b4cbe28c4ab07f5eb7acea7123295 100644 (file)
@@ -573,6 +573,11 @@ Sema::CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &Old,
 
 bool Sema::IsOverload(FunctionDecl *New, FunctionDecl *Old,
                       bool UseUsingDeclRules) {
+  // If both of the functions are extern "C", then they are not
+  // overloads.
+  if (Old->isExternC() && New->isExternC())
+    return false;
+
   FunctionTemplateDecl *OldTemplate = Old->getDescribedFunctionTemplate();
   FunctionTemplateDecl *NewTemplate = New->getDescribedFunctionTemplate();
 
index 0d1c166dcb315b9b5a04ebe50482ddc80a57b653..fdb642c78fcc26d4794019b945e7d0b5314a06bd 100644 (file)
@@ -57,3 +57,14 @@ extern "C"
 
 // PR6991
 extern "C" typedef int (*PutcFunc_t)(int);
+
+
+// PR7859
+extern "C" void pr7859_a(int) {} // expected-note {{previous definition}}
+extern "C" void pr7859_a(int) {} // expected-error {{redefinition}}
+
+extern "C" void pr7859_b() {} // expected-note {{previous definition}}
+extern "C" void pr7859_b(int) {} // expected-error {{conflicting}}
+
+extern "C" void pr7859_c(short) {} // expected-note {{previous definition}}
+extern "C" void pr7859_c(int) {} // expected-error {{conflicting}}