This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH]: Fix bug 2525
- To: gcc-patches at gcc dot gnu dot org
- Subject: [C++ PATCH]: Fix bug 2525
- From: Nathan Sidwell <nathan at codesourcery dot com>
- Date: Wed, 16 May 2001 10:51:13 +0100
- Organization: Codesourcery LLC
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
{}
};