Re: [C++ Patch] PR 34927

2011-10-08 Thread Jason Merrill

On 10/08/2011 12:56 AM, Paolo Carlini wrote:

The fix seems easy: output a cloned destructor only once (+ output any
other member functions normally).



+ static bool done_cloned_dest = false;


This seems like it will only complain once per translation unit about 
virtual destructors.  How about instead of this flag, we look at which 
variant it is and only complain about one of them, perhaps the base?


Jason



Re: [C++ Patch] PR 34927

2011-10-08 Thread Paolo Carlini
Hi,

 This seems like it will only complain once per translation unit about virtual 
 destructors.

Oops, sorry, but this specific issue could be solved rather easily by not using 
a static, right?

  How about instead of this flag, we look at which variant it is and only 
 complain about one of them, perhaps the base?

Yes, isn't simply not using a static a rather straightforward alternative?

Paolo


Re: [C++ Patch] PR 34927

2011-10-08 Thread Paolo Carlini
 Yes, isn't simply not using a static a rather straightforward alternative?

Ok, now I see: since it's easy, better avoid using *any* sort of flag, I'll do 
it.

Paolo


[C++ Patch] PR 34927 (Take 2)

2011-10-08 Thread Paolo Carlini

Hi again,

today I had a look to clone_function_decl  co, and came up with the 
below. I understand DECL_DELETING_DESTRUCTOR_P would work as well...


Tested x86_64-linux.

Thanks,
Paolo.

///
2011-10-08  Paolo Carlini  paolo.carl...@oracle.com

PR c++/34927
* typeck2.c (abstract_virtuals_error_sfinae): Don't produce duplicate
inform messages in case of cloned destructor.
Index: typeck2.c
===
--- typeck2.c   (revision 179660)
+++ typeck2.c   (working copy)
@@ -340,7 +340,10 @@ abstract_virtuals_error_sfinae (tree decl, tree ty
  type);
 
   FOR_EACH_VEC_ELT (tree, pure, ix, fn)
-   inform (input_location, \t%+#D, fn);
+   if (! DECL_CLONED_FUNCTION_P (fn)
+   || DECL_COMPLETE_DESTRUCTOR_P (fn))
+ inform (input_location, \t%+#D, fn);
+
   /* Now truncate the vector.  This leaves it non-null, so we know
 there are pure virtuals, but empty so we don't list them out
 again.  */


Re: [C++ Patch] PR 34927 (Take 2)

2011-10-08 Thread Jason Merrill

OK.

Jason


[C++ Patch] PR 34927

2011-10-07 Thread Paolo Carlini

Hi,

this diagnostic PR is about duplicate inform messages for this kind of 
testcase, where C has a cloned destructor:


class A {};

struct C : A
{
  virtual ~C () = 0;
} c;

The fix seems easy: output a cloned destructor only once (+ output any 
other member functions normally). Patch tested x86_64-linux for regressions.


Ok?

Thanks,
Paolo.

///
2011-10-07  Paolo Carlini  paolo.carl...@oracle.com

PR c++/34927
* typeck2.c (abstract_virtuals_error_sfinae): Don't produce duplicate
inform messages in case of cloned destructor.
Index: typeck2.c
===
--- typeck2.c   (revision 179660)
+++ typeck2.c   (working copy)
@@ -340,7 +340,17 @@ abstract_virtuals_error_sfinae (tree decl, tree ty
  type);
 
   FOR_EACH_VEC_ELT (tree, pure, ix, fn)
-   inform (input_location, \t%+#D, fn);
+   {
+ static bool done_cloned_dest = false;
+
+ bool is_cloned_dest = DECL_CLONED_FUNCTION_P (fn);
+ if (! is_cloned_dest || ! done_cloned_dest)
+   inform (input_location, \t%+#D, fn);
+
+ if (is_cloned_dest)
+   done_cloned_dest = true;
+   }
+
   /* Now truncate the vector.  This leaves it non-null, so we know
 there are pure virtuals, but empty so we don't list them out
 again.  */