This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[C++ PATCH]: Fix bug 2525


Hi,
I've installed this patch on the mainline which fixes bug 2525. We ICED
trying to check things. Relax things a bit.

built & tested on i686-pc-linux-gnu, approved by Mark.

nathan
-- 
Dr Nathan Sidwell   ::   http://www.codesourcery.com   ::   CodeSourcery LLC
         'But that's a lie.' - 'Yes it is. What's your point?'
nathan@codesourcery.com : http://www.cs.bris.ac.uk/~nathan/ : nathan@acm.org
2001-05-08  Nathan Sidwell  <nathan@codesourcery.com>

	* init.c (member_init_ok_or_else): Take a tree rather than
	string for name.
	(expand_member_init): Adjust.

2001-05-08  Nathan Sidwell  <nathan@codesourcery.com>

	* g++.pt/inherit2.C: Remove XFAIL.

Index: cp/init.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/cp/init.c,v
retrieving revision 1.242
diff -c -3 -p -r1.242 init.c
*** init.c	2001/05/02 14:38:32	1.242
--- init.c	2001/05/08 15:47:16
*************** static tree build_vec_delete_1 PARAMS ((
*** 42,48 ****
  static void perform_member_init PARAMS ((tree, tree, int));
  static void sort_base_init PARAMS ((tree, tree, tree *, tree *));
  static tree build_builtin_delete_call PARAMS ((tree));
! static int member_init_ok_or_else PARAMS ((tree, tree, const char *));
  static void expand_virtual_init PARAMS ((tree, tree));
  static tree sort_member_init PARAMS ((tree, tree));
  static tree initializing_context PARAMS ((tree));
--- 42,48 ----
  static void perform_member_init PARAMS ((tree, tree, int));
  static void sort_base_init PARAMS ((tree, tree, tree *, tree *));
  static tree build_builtin_delete_call PARAMS ((tree));
! static int member_init_ok_or_else PARAMS ((tree, tree, tree));
  static void expand_virtual_init PARAMS ((tree, tree));
  static tree sort_member_init PARAMS ((tree, tree));
  static tree initializing_context PARAMS ((tree));
*************** static int
*** 1043,1061 ****
  member_init_ok_or_else (field, type, member_name)
       tree field;
       tree type;
!      const char *member_name;
  {
    if (field == error_mark_node)
      return 0;
    if (field == NULL_TREE || initializing_context (field) != type)
      {
!       cp_error ("class `%T' does not have any field named `%s'", type,
  		member_name);
        return 0;
      }
    if (TREE_STATIC (field))
      {
!       cp_error ("field `%#D' is static; only point of initialization is its declaration",
  		field);
        return 0;
      }
--- 1043,1061 ----
  member_init_ok_or_else (field, type, member_name)
       tree field;
       tree type;
!      tree member_name;
  {
    if (field == error_mark_node)
      return 0;
    if (field == NULL_TREE || initializing_context (field) != type)
      {
!       cp_error ("class `%T' does not have any field named `%D'", type,
  		member_name);
        return 0;
      }
    if (TREE_STATIC (field))
      {
!       cp_error ("field `%#D' is static; the only point of initialization is its definition",
  		field);
        return 0;
      }
*************** expand_member_init (exp, name, init)
*** 1162,1168 ****
      try_member:
        field = lookup_field (type, name, 1, 0);
  
!       if (! member_init_ok_or_else (field, type, IDENTIFIER_POINTER (name)))
  	return NULL_TREE;
  
        init = build_tree_list (field, init);
--- 1162,1168 ----
      try_member:
        field = lookup_field (type, name, 1, 0);
  
!       if (! member_init_ok_or_else (field, type, name))
  	return NULL_TREE;
  
        init = build_tree_list (field, init);
Index: testsuite/g++.old-deja/g++.pt/inherit2.C
===================================================================
RCS file: /cvs/gcc/egcs/gcc/testsuite/g++.old-deja/g++.pt/inherit2.C,v
retrieving revision 1.2
diff -c -3 -p -r1.2 inherit2.C
*** inherit2.C	2001/02/12 04:10:07	1.2
--- inherit2.C	2001/05/08 15:47:19
***************
*** 1,7 ****
  // Test that we warn about unqualified references to implicit typenames.
! // Bug: g++ is confused by the binding for ::AN and crashes.
  // Special g++ Options:
! // excess errors test - XFAIL *-*-*
  
  template <class T> struct A {
    struct AA { };
--- 1,7 ----
  // Test that we warn about unqualified references to implicit typenames.
! 
  // Special g++ Options:
! // Build don't link:
  
  template <class T> struct A {
    struct AA { };
// Build don't link:
// 
// Copyright (C) 2001 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 7 May 2001 <nathan@codesourcery.com>

// Bug 2525. We ICEd when a namespace scope template was erroneously
// given as a base member init.

namespace N1
{
  template<typename T>
  struct B
  {
    B (T);
  };
  
  template<typename T>
  struct D : B<T>
  {
    D (T r)
      : B (r)  // ERROR - no field named B
    {}
  };
}

template<typename T>
struct D1 : N1::B<T>
{
  D1 (T r)
    : N1::B<T> (r)
  {}
};

template<typename T>
struct D2 : N1::B<T>
{
  D2 (T r)
    : N1::B (r) // ERROR - no field named N1::B
  {}
};

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]