]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/17821 (Poor diagnostic for using . instead of ->)
authorNathan Sidwell <nathan@codesourcery.com>
Fri, 17 Dec 2004 15:58:04 +0000 (15:58 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 17 Dec 2004 15:58:04 +0000 (15:58 +0000)
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): <TYPE_DECL case> Remove extraneous braces.
testsuite:
PR c++/17821
* g++.dg/lookup/conv-5.C: New.

From-SVN: r92316

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/error.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/conv-5.C [new file with mode: 0644]

index 96bb671d1075a5b5ed318656e3f535b3c476348d..241e62a7b93a47d58c4fb1b00fa48c5b089db6aa 100644 (file)
@@ -1,3 +1,12 @@
+2004-12-17  Nathan Sidwell  <nathan@codesourcery.com>
+
+       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): <TYPE_DECL case> Remove extraneous braces.
+
 2004-12-16  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/18905
index 9c0a2718f5f618d4699765847f1722c391465cd0..688744cd66b120a7be30d16a8c8ed97860d9cbc3 100644 (file)
@@ -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)
index de3e1a6c8dc9d95d793b6b00479c3388cc424283..54fade9b7d4cf1c0a69130cfb8ce31411cd11be3 100644 (file)
@@ -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.  */
index ffdade0251abb997d16aee817c70cac6f602c7f6..8599616a3aa296bf08b5294fe703bd824988af09 100644 (file)
@@ -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)
index 56acc8e3e76fbbcf244d3e599de537f32881e985..82ae7646245afe15b8c0a78ddd739be3f7f218bb 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-17  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/17821
+       * g++.dg/lookup/conv-5.C: New.
+
 2004-12-16  Ziemowit Laski  <zlaski@apple.com>
 
        * 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 (file)
index 0000000..e238e90
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Dec 2004 <nathan@codesourcery.com>
+
+// PR 17821. bogus error
+// Origin:  Mikael Kilpel?inen <belz@kolumbus.fi>
+
+struct A {
+  template<typename T>
+  operator T() const;
+  
+  operator float() const;
+};
+