*** src/gcc/cp/decl.c.~1~	Tue Jan  2 17:20:14 2001
--- src/gcc/cp/decl.c	Mon Nov 19 16:46:55 2001
*************** make_rtl_for_nonlocal_decl (decl, init, 
*** 7316,7326 ****
       tree init;
       const char *asmspec;
  {
!   int toplev;
!   tree type;
! 
!   type = TREE_TYPE (decl);
!   toplev = toplevel_bindings_p ();
  
    /* Handle non-variables up front.  */
    if (TREE_CODE (decl) != VAR_DECL)
--- 7316,7323 ----
       tree init;
       const char *asmspec;
  {
!   int toplev = toplevel_bindings_p ();
!   int defer_p;
  
    /* Handle non-variables up front.  */
    if (TREE_CODE (decl) != VAR_DECL)
*************** make_rtl_for_nonlocal_decl (decl, init, 
*** 7329,7382 ****
        return;
      }
  
    /* Set the DECL_ASSEMBLER_NAME for the variable.  */
    if (asmspec)
      DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
  
!   if (DECL_VIRTUAL_P (decl))
!     make_decl_rtl (decl, NULL_PTR, toplev);
!   else if (TREE_READONLY (decl)
! 	   && DECL_INITIAL (decl) != NULL_TREE
! 	   && DECL_INITIAL (decl) != error_mark_node
! 	   && ! EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl)))
!     {
!       DECL_INITIAL (decl) = save_expr (DECL_INITIAL (decl));
  
!       if (toplev && ! TREE_PUBLIC (decl))
! 	{
! 	  /* If this is a static const, change its apparent linkage
! 	     if it belongs to a #pragma interface.  */
! 	  if (!interface_unknown)
! 	    {
! 	      TREE_PUBLIC (decl) = 1;
! 	      DECL_EXTERNAL (decl) = interface_only;
! 	    }
! 	  make_decl_rtl (decl, asmspec, toplev);
! 	}
!       else if (toplev)
! 	rest_of_decl_compilation (decl, asmspec, toplev, at_eof);
!     }
!   else if (DECL_LANG_SPECIFIC (decl) && DECL_IN_AGGR_P (decl))
      {
!       my_friendly_assert (TREE_STATIC (decl), 19990828);
! 
!       if (init == NULL_TREE
! #ifdef DEFAULT_STATIC_DEFS
! 	  /* If this code is dead, then users must
! 	     explicitly declare static member variables
! 	     outside the class def'n as well.  */
! 	  && TYPE_NEEDS_CONSTRUCTING (type)
! #endif
! 	  )
  	{
! 	  DECL_EXTERNAL (decl) = 1;
! 	  make_decl_rtl (decl, asmspec, 1);
  	}
!       else
! 	rest_of_decl_compilation (decl, asmspec, toplev, at_eof);
      }
!   else if (TREE_CODE (CP_DECL_CONTEXT (decl)) == NAMESPACE_DECL
! 	   || (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)))
      rest_of_decl_compilation (decl, asmspec, toplev, at_eof);
  }
  
--- 7326,7380 ----
        return;
      }
  
+   /* If we see a class member here, it should be a static data
+      member.  */
+   if (DECL_LANG_SPECIFIC (decl) && DECL_IN_AGGR_P (decl))
+     {
+       my_friendly_assert (TREE_STATIC (decl), 19990828);
+       /* An in-class declaration of a static data member should be
+ 	 external; it is only a declaration, and not a definition.  */
+       if (init == NULL_TREE)
+ 	my_friendly_assert (DECL_EXTERNAL (decl), 20000723);
+     }
+ 
    /* Set the DECL_ASSEMBLER_NAME for the variable.  */
    if (asmspec)
      DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
  
!   /* We don't create any RTL for local variables.  */
!   if (DECL_FUNCTION_SCOPE_P (decl) && !TREE_STATIC (decl))
!     return;
  
!   /* We defer emission of local statics until the corresponding
!      DECL_STMT is expanded.  */
!   defer_p = DECL_FUNCTION_SCOPE_P (decl) || DECL_VIRTUAL_P (decl);
! 
!   /* We try to defer namespace-scope static constants so that they are
!      not emitted into the object file unncessarily.  */
!   if (!DECL_VIRTUAL_P (decl)
!       && TREE_READONLY (decl)
!       && DECL_INITIAL (decl) != NULL_TREE
!       && DECL_INITIAL (decl) != error_mark_node
!       && ! EMPTY_CONSTRUCTOR_P (DECL_INITIAL (decl))
!       && toplev
!       && !TREE_PUBLIC (decl))
      {
!       /* Fool with the linkage according to #pragma interface.  */
!       if (!interface_unknown)
  	{
! 	  TREE_PUBLIC (decl) = 1;
! 	  DECL_EXTERNAL (decl) = interface_only;
  	}
! 
!       defer_p = 1;
      }
! 
!   /* If we're deferring the variable, just make RTL.  Do not actually
!      emit the variable.  */
!   if (defer_p)
!     make_decl_rtl (decl, asmspec, toplev);
!   /* If we're not deferring, go ahead and assemble the variable.  */
!   else
      rest_of_decl_compilation (decl, asmspec, toplev, at_eof);
  }
  
*************** make_rtl_for_local_static (decl)
*** 7390,7396 ****
  
    /* If we inlined this variable, we could see it's declaration
       again.  */
!   if (DECL_RTL (decl))
      return;
  
    if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))
--- 7388,7394 ----
  
    /* If we inlined this variable, we could see it's declaration
       again.  */
!   if (TREE_ASM_WRITTEN (decl))
      return;
  
    if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl))

