Commit 96c993a8 by Jason Merrill Committed by Jason Merrill

re PR c++/17256 (undefined but used static or inline functions should be diagnosed)

        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
parent c0572427
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> 2005-11-06 Mark Mitchell <mark@codesourcery.com>
* class.c (record_subobject_offsets): Don't record offsets past * class.c (record_subobject_offsets): Don't record offsets past
......
...@@ -3062,8 +3062,6 @@ cp_finish_file (void) ...@@ -3062,8 +3062,6 @@ cp_finish_file (void)
{ {
if (/* Check online inline functions that were actually used. */ if (/* Check online inline functions that were actually used. */
TREE_USED (decl) && DECL_DECLARED_INLINE_P (decl) TREE_USED (decl) && DECL_DECLARED_INLINE_P (decl)
/* But not defined. */
&& DECL_REALLY_EXTERN (decl)
/* If the definition actually was available here, then the /* If the definition actually was available here, then the
fact that the function was not defined merely represents fact that the function was not defined merely represents
that for some reason (use of a template repository, that for some reason (use of a template repository,
...@@ -3076,10 +3074,8 @@ cp_finish_file (void) ...@@ -3076,10 +3074,8 @@ cp_finish_file (void)
&& !DECL_EXPLICIT_INSTANTIATION (decl)) && !DECL_EXPLICIT_INSTANTIATION (decl))
{ {
warning (0, "inline function %q+D used but never defined", decl); warning (0, "inline function %q+D used but never defined", decl);
/* This symbol is effectively an "extern" declaration now. /* Avoid a duplicate warning from check_global_declaration_1. */
This is not strictly necessary, but removes a duplicate TREE_NO_WARNING (decl) = 1;
warning. */
TREE_PUBLIC (decl) = 1;
} }
} }
......
...@@ -11813,10 +11813,15 @@ instantiate_pending_templates (int retries) ...@@ -11813,10 +11813,15 @@ instantiate_pending_templates (int retries)
to avoid infinite loop. */ to avoid infinite loop. */
if (pending_templates && retries >= max_tinst_depth) if (pending_templates && retries >= max_tinst_depth)
{ {
tree decl = TREE_VALUE (pending_templates);
error ("template instantiation depth exceeds maximum of %d" error ("template instantiation depth exceeds maximum of %d"
" instantiating %q+D, possibly from virtual table generation" " instantiating %q+D, possibly from virtual table generation"
" (use -ftemplate-depth-NN to increase the maximum)", " (use -ftemplate-depth-NN to increase the maximum)",
max_tinst_depth, TREE_VALUE (pending_templates)); max_tinst_depth, decl);
if (TREE_CODE (decl) == FUNCTION_DECL)
/* Pretend that we defined it. */
DECL_INITIAL (decl) = error_mark_node;
return; return;
} }
......
// 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(); } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment