re PR c++/17256 (undefined but used static or inline functions should be diagnosed)
authorJason Merrill <jason@redhat.com>
Mon, 7 Nov 2005 06:17:47 +0000 (01:17 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 7 Nov 2005 06:17:47 +0000 (01:17 -0500)
        PR c++/17256
        * decl2.c (cp_finish_file): Fix conditions for undefined warning.
        Set TREE_NO_WARNING instead of TREE_PUBLIC.
        * pt.c (instantiate_pending_templates): Set DECL_INITIAL to avoid
        a warning on a function we didn't instantiate because of excessive
        recursion.

Co-Authored-By: James A. Morrison <phython@gcc.gnu.org>
From-SVN: r106581

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/warn/undefined1.C [new file with mode: 0644]

index 86b9decf5e2292bcea34a066f09f5b0b81136e48..3d2f36ec7679bbab0990d3e4dd37de4d464b5418 100644 (file)
@@ -1,3 +1,13 @@
+2005-11-06  Jason Merrill  <jason@redhat.com>
+           James A. Morrison <phython@gcc.gnu.org>
+
+       PR c++/17256
+       * decl2.c (cp_finish_file): Fix conditions for undefined warning.
+       Set TREE_NO_WARNING instead of TREE_PUBLIC.
+       * pt.c (instantiate_pending_templates): Set DECL_INITIAL to avoid
+       a warning on a function we didn't instantiate because of excessive
+       recursion.
+
 2005-11-06  Mark Mitchell  <mark@codesourcery.com>
 
        * class.c (record_subobject_offsets): Don't record offsets past
index 77ac5f7ae9ea56e29bde4fd52d6891c249f6918f..dcf3217dfb308e9a9f166bf4a0e3847d9adb8723 100644 (file)
@@ -3062,8 +3062,6 @@ cp_finish_file (void)
     {
       if (/* Check online inline functions that were actually used.  */
          TREE_USED (decl) && DECL_DECLARED_INLINE_P (decl)
-         /* But not defined.  */
-         && DECL_REALLY_EXTERN (decl)
          /* If the definition actually was available here, then the
             fact that the function was not defined merely represents
             that for some reason (use of a template repository,
@@ -3076,10 +3074,8 @@ cp_finish_file (void)
          && !DECL_EXPLICIT_INSTANTIATION (decl))
        {
          warning (0, "inline function %q+D used but never defined", decl);
-         /* This symbol is effectively an "extern" declaration now.
-            This is not strictly necessary, but removes a duplicate
-            warning.  */
-         TREE_PUBLIC (decl) = 1;
+         /* Avoid a duplicate warning from check_global_declaration_1.  */
+         TREE_NO_WARNING (decl) = 1;
        }
     }
 
index 0490fd18ba779ec179430eacaa6d0859ce4ea54a..c2fc36f2dfddc55baa06715cd0818ef67417ca8e 100644 (file)
@@ -11813,10 +11813,15 @@ instantiate_pending_templates (int retries)
      to avoid infinite loop.  */
   if (pending_templates && retries >= max_tinst_depth)
     {
+      tree decl = TREE_VALUE (pending_templates);
+
       error ("template instantiation depth exceeds maximum of %d"
-           " instantiating %q+D, possibly from virtual table generation"
-           " (use -ftemplate-depth-NN to increase the maximum)",
-           max_tinst_depth, TREE_VALUE (pending_templates));
+            " instantiating %q+D, possibly from virtual table generation"
+            " (use -ftemplate-depth-NN to increase the maximum)",
+            max_tinst_depth, decl);
+      if (TREE_CODE (decl) == FUNCTION_DECL)
+       /* Pretend that we defined it.  */
+       DECL_INITIAL (decl) = error_mark_node;
       return;
     }
 
diff --git a/gcc/testsuite/g++.dg/warn/undefined1.C b/gcc/testsuite/g++.dg/warn/undefined1.C
new file mode 100644 (file)
index 0000000..87fa3ec
--- /dev/null
@@ -0,0 +1,7 @@
+// PR 17256
+
+inline static void f1(void); // { dg-warning "used but never" }
+void g1(void) { if (0) { f1(); } }
+
+inline void f2(void); // { dg-warning "used but never" }
+void g2(void) { if (0) { f2(); } }