]> granicus.if.org Git - clang/commitdiff
Provide a specific diagnostic when trying to redefine an "extern
authorDouglas Gregor <dgregor@apple.com>
Tue, 7 Sep 2010 15:51:01 +0000 (15:51 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 7 Sep 2010 15:51:01 +0000 (15:51 +0000)
inline" function outside of GNU89 mode. Fixes
<rdar://problem/6880464>.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/Sema/redefinition.c

index 82f059b865b084426b4f997f2a792c6a259f131d..3bb85fc0f09865713365e039e1a704e9f1d8c98c 100644 (file)
@@ -1737,6 +1737,9 @@ def err_redefinition : Error<"redefinition of %0">;
 def err_definition_of_implicitly_declared_member : Error<
   "definition of implicitly declared %select{constructor|copy constructor|"
   "copy assignment operator|destructor}1">;
+def err_redefinition_extern_inline : Error<
+  "redefinition of a 'extern inline' function %0 is not supported in "
+  "%select{C99 mode|C++}1">;
   
 def warn_redefinition_of_typedef : Warning<
   "redefinition of typedef %0 is invalid in C">,
index f5e045a722a0d0dc67ba9bd9cac2816dda6d7891..df077fd70978904d6b84701ed38b543d9baa551b 100644 (file)
@@ -4806,7 +4806,12 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D) {
   const FunctionDecl *Definition;
   if (FD->hasBody(Definition) &&
       !canRedefineFunction(Definition, getLangOptions())) {
-    Diag(FD->getLocation(), diag::err_redefinition) << FD->getDeclName();
+    if (getLangOptions().GNUMode && Definition->isInlineSpecified() &&
+        Definition->getStorageClass() == SC_Extern)
+      Diag(FD->getLocation(), diag::err_redefinition_extern_inline)
+        << FD->getDeclName() << getLangOptions().CPlusPlus;
+    else
+      Diag(FD->getLocation(), diag::err_redefinition) << FD->getDeclName();
     Diag(Definition->getLocation(), diag::note_previous_definition);
   }
 
index 1092b33ca35d55f1f9c2b6379a175111fc31254b..1ee35f7c36ee55997cf8e0b3644e29e3bd634f0e 100644 (file)
@@ -8,3 +8,7 @@ int foo(x) {
   return 0;
 }
 int x = 1;
+
+// <rdar://problem/6880464>
+extern inline int g(void) { return 0; } // expected-note{{previous definition}}
+int g(void) { return 0; } // expected-error{{redefinition of a 'extern inline' function 'g' is not supported in C99 mode}}