diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2004-12-01 10:16:50 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2004-12-01 10:16:50 +0000 |
commit | 386489e361a1299e34dd6f755dad1f4023ce08e3 (patch) | |
tree | fd2f0d33bb80e63ed673425f60340bd87354c1ef | |
parent | eab97e449ba769f0a8f4cf5cd69970bbf38de38f (diff) | |
download | gcc-386489e361a1299e34dd6f755dad1f4023ce08e3.zip gcc-386489e361a1299e34dd6f755dad1f4023ce08e3.tar.gz gcc-386489e361a1299e34dd6f755dad1f4023ce08e3.tar.bz2 |
re PR c++/17431 (Internal error: Segmentation fault (program cc1plus))
cp:
PR c++/17431
* call.c (standard_conversion): Add FLAGS parameter. Do not allow
derived to base conversion when checking constructor
accessibility.
(implicit_conversion): Pass FLAGS to standard_conversion.
(check_constructir_callable): Disallow conversion functions.
testsuite:
PR c++/17431
* g++.dg/overload/arg1.C: New.
* g++.dg/overload/arg2.C: New.
* g++.dg/overload/arg3.C: New.
* g++.dg/overload/arg4.C: New.
From-SVN: r91559
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/call.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/overload/arg1.C | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/overload/arg2.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/overload/arg3.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/overload/arg4.C | 30 |
7 files changed, 121 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7f65a2d..81d1dc8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2004-12-01 Nathan Sidwell <nathan@codesourcery.com> + + PR c++/17431 + * call.c (standard_conversion): Add FLAGS parameter. Do not allow + derived to base conversion when checking constructor + accessibility. + (implicit_conversion): Pass FLAGS to standard_conversion. + (check_constructir_callable): Disallow conversion functions. + 2004-11-30 Kazu Hirata <kazu@cs.umass.edu> * parser.c: Fix comment typos. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c67b16f..f8af887 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -170,7 +170,7 @@ static struct z_candidate *add_conv_candidate static struct z_candidate *add_function_candidate (struct z_candidate **, tree, tree, tree, tree, tree, int); static conversion *implicit_conversion (tree, tree, tree, int); -static conversion *standard_conversion (tree, tree, tree); +static conversion *standard_conversion (tree, tree, tree, int); static conversion *reference_binding (tree, tree, tree, int); static conversion *build_conv (conversion_kind, tree, conversion *); static bool is_subseq (conversion *, conversion *); @@ -583,7 +583,7 @@ strip_top_quals (tree t) also pass the expression EXPR to convert from. */ static conversion * -standard_conversion (tree to, tree from, tree expr) +standard_conversion (tree to, tree from, tree expr, int flags) { enum tree_code fcode, tcode; conversion *conv; @@ -633,7 +633,7 @@ standard_conversion (tree to, tree from, tree expr) the standard conversion sequence to perform componentwise conversion. */ conversion *part_conv = standard_conversion - (TREE_TYPE (to), TREE_TYPE (from), NULL_TREE); + (TREE_TYPE (to), TREE_TYPE (from), NULL_TREE, flags); if (part_conv) { @@ -815,7 +815,8 @@ standard_conversion (tree to, tree from, tree expr) else if (fcode == VECTOR_TYPE && tcode == VECTOR_TYPE && vector_types_convertible_p (from, to)) return build_conv (ck_std, to, conv); - else if (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) + else if (!(flags & LOOKUP_CONSTRUCTOR_CALLABLE) + && IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) && is_properly_derived_from (from, to)) { if (conv->kind == ck_rvalue) @@ -1227,7 +1228,7 @@ implicit_conversion (tree to, tree from, tree expr, int flags) if (TREE_CODE (to) == REFERENCE_TYPE) conv = reference_binding (to, from, expr, flags); else - conv = standard_conversion (to, from, expr); + conv = standard_conversion (to, from, expr, flags); if (conv) return conv; @@ -4081,6 +4082,7 @@ check_constructor_callable (tree type, tree expr) build_tree_list (NULL_TREE, expr), type, LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING + | LOOKUP_NO_CONVERSION | LOOKUP_CONSTRUCTOR_CALLABLE); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b7e8880..e960995 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2004-12-01 Nathan Sidwell <nathan@codesourcery.com> + + PR c++/17431 + * g++.dg/overload/arg1.C: New. + * g++.dg/overload/arg2.C: New. + * g++.dg/overload/arg3.C: New. + * g++.dg/overload/arg4.C: New. + 2004-12-01 Joseph S. Myers <joseph@codesourcery.com> * gcc.dg/c99-flex-array-4.c: Remove. diff --git a/gcc/testsuite/g++.dg/overload/arg1.C b/gcc/testsuite/g++.dg/overload/arg1.C new file mode 100644 index 0000000..6ac6a7e --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg1.C @@ -0,0 +1,23 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); // { dg-error "" "" } + B(B &); // { dg-error "" "" } + B(A); // { dg-error "" "" } +}; + +void foo(B); + +void bar() +{ + foo(0); // { dg-error "no matching function|initializing" "" } +} diff --git a/gcc/testsuite/g++.dg/overload/arg2.C b/gcc/testsuite/g++.dg/overload/arg2.C new file mode 100644 index 0000000..1e39186 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg2.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); + B(A); +}; + +void foo(B); + +void bar() +{ + foo(0); +} diff --git a/gcc/testsuite/g++.dg/overload/arg3.C b/gcc/testsuite/g++.dg/overload/arg3.C new file mode 100644 index 0000000..1778ce5 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg3.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); // { dg-error "" "" } + B(B&); // { dg-error "" "" } +}; + +void foo(B); + +void bar() +{ + foo(0); // { dg-error "no matching function|initializing" "" } +} diff --git a/gcc/testsuite/g++.dg/overload/arg4.C b/gcc/testsuite/g++.dg/overload/arg4.C new file mode 100644 index 0000000..34aa625 --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/arg4.C @@ -0,0 +1,30 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 30 Nov 2004 <nathan@codesourcery.com> + +// PR 17431. copy ctor from user conv +// Origin: Volker Reichelt <reichelt@gcc.gnu.org> + +struct A {}; + +struct B : A +{ + B(int); // { dg-error "" "" } + B(B&); // { dg-error "" "" } + B(A); // { dg-error "" "" } +}; + +struct C +{ + operator B () const; +}; + + +void foo(B); + +void bar() +{ + C c; + foo(c); // { dg-error "no matching function|initializing" "" } +} |