From: Nathan Sidwell Date: Fri, 17 Dec 2004 15:58:04 +0000 (+0000) Subject: re PR c++/17821 (Poor diagnostic for using . instead of ->) X-Git-Tag: releases/gcc-4.0.0~2094 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b54a07e8d266a3f49d7cd7aa8e8318af506b4ab1;p=thirdparty%2Fgcc.git re PR c++/17821 (Poor diagnostic for using . instead of ->) cp: PR c++/17821 * class.c (add_method): Do not push conversion operators into a binding level. * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE_TYPE): Reformat. * error.c (dump_decl): Remove extraneous braces. testsuite: PR c++/17821 * g++.dg/lookup/conv-5.C: New. From-SVN: r92316 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 96bb671d1075..241e62a7b93a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2004-12-17 Nathan Sidwell + + PR c++/17821 + * class.c (add_method): Do not push conversion operators into a + binding level. + + * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE_TYPE): Reformat. + * error.c (dump_decl): Remove extraneous braces. + 2004-12-16 Nathan Sidwell PR c++/18905 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 9c0a2718f5f6..688744cd66b1 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -857,7 +857,8 @@ add_method (tree type, tree method) int using; unsigned slot; tree overload; - int template_conv_p; + bool template_conv_p = false; + bool conv_p; VEC(tree) *method_vec; bool complete_p; bool insert_p = false; @@ -868,8 +869,10 @@ add_method (tree type, tree method) complete_p = COMPLETE_TYPE_P (type); using = (DECL_CONTEXT (method) != type); - template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL - && DECL_TEMPLATE_CONV_FN_P (method)); + conv_p = DECL_CONV_FN_P (method); + if (conv_p) + template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL + && DECL_TEMPLATE_CONV_FN_P (method)); method_vec = CLASSTYPE_METHOD_VEC (type); if (!method_vec) @@ -901,7 +904,6 @@ add_method (tree type, tree method) } else { - bool conv_p = DECL_CONV_FN_P (method); tree m; insert_p = true; @@ -1012,7 +1014,7 @@ add_method (tree type, tree method) /* Add the new binding. */ overload = build_overload (method, current_fns); - if (slot >= CLASSTYPE_FIRST_CONVERSION_SLOT && !complete_p) + if (!conv_p && slot >= CLASSTYPE_FIRST_CONVERSION_SLOT && !complete_p) push_class_level_binding (DECL_NAME (method), overload); if (insert_p) diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index de3e1a6c8dc9..54fade9b7d4c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2192,10 +2192,11 @@ struct lang_decl GTY(()) /* For a template instantiation TYPE, returns the TYPE corresponding to the primary template. Otherwise returns TYPE itself. */ -#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \ - ((CLASSTYPE_USE_TEMPLATE ((TYPE)) && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \ - ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \ - (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \ +#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \ + ((CLASSTYPE_USE_TEMPLATE ((TYPE)) \ + && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \ + ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \ + (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \ : (TYPE)) /* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */ diff --git a/gcc/cp/error.c b/gcc/cp/error.c index ffdade0251ab..8599616a3aa2 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -713,19 +713,17 @@ dump_decl (tree t, int flags) switch (TREE_CODE (t)) { case TYPE_DECL: - { - /* Don't say 'typedef class A' */ - if (DECL_ARTIFICIAL (t)) - { - if ((flags & TFF_DECL_SPECIFIERS) - && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM) - /* Say `class T' not just `T'. */ - pp_cxx_identifier (cxx_pp, "class"); - - dump_type (TREE_TYPE (t), flags); - break; - } - } + /* Don't say 'typedef class A' */ + if (DECL_ARTIFICIAL (t)) + { + if ((flags & TFF_DECL_SPECIFIERS) + && TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM) + /* Say `class T' not just `T'. */ + pp_cxx_identifier (cxx_pp, "class"); + + dump_type (TREE_TYPE (t), flags); + break; + } if (flags & TFF_DECL_SPECIFIERS) pp_cxx_identifier (cxx_pp, "typedef"); dump_simple_decl (t, DECL_ORIGINAL_TYPE (t) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 56acc8e3e76f..82ae7646245a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-12-17 Nathan Sidwell + + PR c++/17821 + * g++.dg/lookup/conv-5.C: New. + 2004-12-16 Ziemowit Laski * objc.dg/stabs-1.m: New test. diff --git a/gcc/testsuite/g++.dg/lookup/conv-5.C b/gcc/testsuite/g++.dg/lookup/conv-5.C new file mode 100644 index 000000000000..e238e90d3558 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/conv-5.C @@ -0,0 +1,15 @@ +// { dg-do compile } + +// Copyright (C) 2004 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 17 Dec 2004 + +// PR 17821. bogus error +// Origin: Mikael Kilpel?inen + +struct A { + template + operator T() const; + + operator float() const; +}; +