aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-03-07 10:10:22 -0500
committerJason Merrill <jason@gcc.gnu.org>2019-03-07 10:10:22 -0500
commitd4babd373b9634c6964cad53423470ac8f38addf (patch)
tree6af919ee11170b35a1dd5ac2f872e4eaeba7038d /gcc
parent5161ffa4f5ae6133167673afc607c07e0be787f8 (diff)
downloadgcc-d4babd373b9634c6964cad53423470ac8f38addf.zip
gcc-d4babd373b9634c6964cad53423470ac8f38addf.tar.gz
gcc-d4babd373b9634c6964cad53423470ac8f38addf.tar.bz2
PR c++/80916 - spurious "static but not defined" warning.
Nothing can refer to an internal decl with no definition, so we shouldn't treat such a decl as a possible devirtualization target. * gimple-fold.c (can_refer_decl_in_current_unit_p): Return false for an internal symbol with DECL_EXTERNAL. From-SVN: r269459
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimple-fold.c7
-rw-r--r--gcc/testsuite/g++.dg/warn/unused-fn1.C16
3 files changed, 27 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b5a7387..507c8e1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-25 Jason Merrill <jason@redhat.com>
+
+ PR c++/80916 - spurious "static but not defined" warning.
+ * gimple-fold.c (can_refer_decl_in_current_unit_p): Return false
+ for an internal symbol with DECL_EXTERNAL.
+
2019-04-07 Richard Biener <rguenther@suse.de>
PR middle-end/89618
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 7ef5004..62d2e0a 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -121,9 +121,12 @@ can_refer_decl_in_current_unit_p (tree decl, tree from_decl)
|| !VAR_OR_FUNCTION_DECL_P (decl))
return true;
- /* Static objects can be referred only if they was not optimized out yet. */
- if (!TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl))
+ /* Static objects can be referred only if they are defined and not optimized
+ out yet. */
+ if (!TREE_PUBLIC (decl))
{
+ if (DECL_EXTERNAL (decl))
+ return false;
/* Before we start optimizing unreachable code we can be sure all
static objects are defined. */
if (symtab->function_flags_ready)
diff --git a/gcc/testsuite/g++.dg/warn/unused-fn1.C b/gcc/testsuite/g++.dg/warn/unused-fn1.C
new file mode 100644
index 0000000..aabc01b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/unused-fn1.C
@@ -0,0 +1,16 @@
+// PR c++/80916
+// { dg-options "-Os -Wunused" }
+
+struct j {
+ virtual void dispatch(void *) {}
+};
+template <typename>
+struct i : j {
+ void dispatch(void *) {} // warning: 'void i< <template-parameter-1-1> >::dispatch(void*) [with <template-parameter-1-1> = {anonymous}::l]' declared 'static' but never defined [-Wunused-function]
+};
+namespace {
+ struct l : i<l> {};
+}
+void f(j *k) {
+ k->dispatch(0);
+}