summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2012-06-27 19:43:29 +0000
committerFariborz Jahanian <fjahanian@apple.com>2012-06-27 19:43:29 +0000
commit91fc39e313240dfa77b48370fe0bd35f24576f14 (patch)
tree74fc5ffa651708d4058dff917c19a1903c01d650
parent20013f1368bbbf2fefdb652162c4190ca2c8eb0c (diff)
downloadbcm5719-llvm-91fc39e313240dfa77b48370fe0bd35f24576f14.tar.gz
bcm5719-llvm-91fc39e313240dfa77b48370fe0bd35f24576f14.zip
patch to suggest 'static' function should be 'static inline'
when it appears to be unused and occurs in a header. // rdar://11202617 llvm-svn: 159282
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--clang/lib/Sema/Sema.cpp14
-rw-r--r--clang/test/SemaCXX/warn-static-function-inheader.cpp12
-rw-r--r--clang/test/SemaCXX/warn-static-function-inheader.h3
4 files changed, 30 insertions, 3 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 38a22a7fce3..fb540502543 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -170,6 +170,10 @@ def warn_used_but_marked_unused: Warning<"%0 was marked unused but was used">,
def warn_unneeded_internal_decl : Warning<
"%select{function|variable}0 %1 is not needed and will not be emitted">,
InGroup<UnneededInternalDecl>, DefaultIgnore;
+def warn_unneeded_static_internal_decl : Warning<
+ "'static' function %0 declared in header file "
+ "should be declared 'static inline'">,
+ InGroup<UnneededInternalDecl>, DefaultIgnore;
def warn_unneeded_member_function : Warning<
"member function %0 is not needed and will not be emitted">,
InGroup<UnneededMemberFunction>, DefaultIgnore;
diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
index 9d18a5c5963..42d5fb74810 100644
--- a/clang/lib/Sema/Sema.cpp
+++ b/clang/lib/Sema/Sema.cpp
@@ -682,9 +682,17 @@ void Sema::ActOnEndOfTranslationUnit() {
if (isa<CXXMethodDecl>(DiagD))
Diag(DiagD->getLocation(), diag::warn_unneeded_member_function)
<< DiagD->getDeclName();
- else
- Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
- << /*function*/0 << DiagD->getDeclName();
+ else {
+ if (FD->getStorageClassAsWritten() == SC_Static &&
+ !FD->isInlineSpecified() &&
+ !SourceMgr.isFromMainFile(
+ SourceMgr.getExpansionLoc(FD->getLocation())))
+ Diag(DiagD->getLocation(), diag::warn_unneeded_static_internal_decl)
+ << DiagD->getDeclName();
+ else
+ Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
+ << /*function*/0 << DiagD->getDeclName();
+ }
} else {
Diag(DiagD->getLocation(),
isa<CXXMethodDecl>(DiagD) ? diag::warn_unused_member_function
diff --git a/clang/test/SemaCXX/warn-static-function-inheader.cpp b/clang/test/SemaCXX/warn-static-function-inheader.cpp
new file mode 100644
index 00000000000..30386d9a258
--- /dev/null
+++ b/clang/test/SemaCXX/warn-static-function-inheader.cpp
@@ -0,0 +1,12 @@
+#include "warn-static-function-inheader.h"
+// RUN: %clang_cc1 -fsyntax-only -verify -Wall %s
+// rdar://11202617
+
+static void another(void) { // expected-warning {{function 'another' is not needed and will not be emitted}}
+}
+
+template <typename T>
+void foo(void) {
+ thing();
+ another();
+}
diff --git a/clang/test/SemaCXX/warn-static-function-inheader.h b/clang/test/SemaCXX/warn-static-function-inheader.h
new file mode 100644
index 00000000000..1c9e00b8bd2
--- /dev/null
+++ b/clang/test/SemaCXX/warn-static-function-inheader.h
@@ -0,0 +1,3 @@
+static void thing(void) { // expected-warning {{'static' function 'thing' declared in header file should be declared 'static inline'}}
+}
+
OpenPOWER on IntegriCloud