[C++ PATCH] Diagnose static data members in anon ns which are used, but weren't defined (PR c++/34094)

Jason Merrill jason@redhat.com
Wed Nov 21 17:36:00 GMT 2007


Jakub Jelinek wrote:
> The important difference is DECL_EXTERNAL, but as it is
> DECL_NOT_REALLY_EXTERN, cp_wrap_global_declarations wants to clear that.
> DECL_NONLOCAL is a FE private flag in this case.

> Instead of issuing the error we could just not set DECL_EXTERNAL for it:

> +         if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl)
> +             && !(TREE_CODE (decl) == VAR_DECL
> +                   && DECL_NONLOCAL (decl)
> +                   && DECL_CLASS_SCOPE_P (decl)
> +                   && DECL_INITIAL (decl) == NULL_TREE
> +                   && type_visibility (DECL_CONTEXT (decl)) == VISIBILITY_ANON))

A static data member that has not yet been defined out-of-class has 
DECL_IN_AGGR_P set.  In that case, we should leave DECL_EXTERNAL set.  I 
don't think we need the other tests.

 > But it is hard to have a g++.dg testcase
> for that, plus I thought when the compiler can detect the bug, it is better
> to report it than to leave it for ld.

Sure.  If we're leaving DECL_EXTERNAL set, and the static data member is 
!TREE_PUBLIC (and DECL_INITIAL is NULL_TREE) it makes sense to complain 
like we do for static functions that are declared but not defined.

Jason



More information about the Gcc-patches mailing list