Patchwork C++ PATCH to warn about inheriting ctors with variadic constructors

login
register
mail settings
Submitter Jason Merrill
Date Oct. 25, 2012, 3:59 p.m.
Message ID <508961EA.3070402@redhat.com>
Download mbox | patch
Permalink /patch/194248/
State New
Headers show

Comments

Jason Merrill - Oct. 25, 2012, 3:59 p.m.
The specification of C++11 inheriting constructors doesn't seem to 
handle C-style variadic functions, so we just drop the ... when 
declaring the constructor in the derived class.  This patch adds a 
warning about that, on by default.

Tested x86_64-pc-linux-gnu, applying to trunk.

Patch

commit e38315ca28ec9f29489ae8f5fca17222d91133ec
Author: Jason Merrill <jason@redhat.com>
Date:   Mon Oct 15 10:45:29 2012 -0700

    c-family/
    	* c.opt (Winherited-variadic-ctor): New.
    cp/
    	* class.c (one_inherited_ctor): Warn about variadic inherited ctor.

diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index d2a97ab..60cb726 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -426,6 +426,10 @@  Warn when a declaration does not specify a type
 Wimport
 C ObjC C++ ObjC++ Undocumented Ignore
 
+Winherited-variadic-ctor
+C++ ObjC++ Var(warn_inh_var_ctor) Init(1) Warning
+Warn about C++11 inheriting constructors when the base has a variadic constructor
+
 Wint-to-pointer-cast
 C ObjC C++ ObjC++ Var(warn_int_to_pointer_cast) Init(1) Warning
 Warn when there is a cast to a pointer from an integer of a different size
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index a478de8..3e1b44a 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -2807,6 +2807,12 @@  one_inherited_ctor (tree ctor, tree t)
       new_parms[i++] = TREE_VALUE (parms);
     }
   one_inheriting_sig (t, ctor, new_parms, i);
+  if (parms == NULL_TREE)
+    {
+      warning (OPT_Winherited_variadic_ctor,
+	       "the ellipsis in %qD is not inherited", ctor);
+      inform (DECL_SOURCE_LOCATION (ctor), "%qD declared here", ctor);
+    }
 }
 
 /* Create default constructors, assignment operators, and so forth for
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 6a90ff1..a6baee7 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -4632,6 +4632,13 @@  cases where multiple declaration is valid and changes nothing.
 @opindex Wno-nested-externs
 Warn if an @code{extern} declaration is encountered within a function.
 
+@item -Wno-inherited-variadic-ctor
+@opindex Winherited-variadic-ctor
+@opindex Wno-inherited-variadic-ctor
+Suppress warnings about use of C++11 inheriting constructors when the
+base class inherited from has a C variadic constructor; the warning is
+on by default because the ellipsis is not inherited.
+
 @item -Winline
 @opindex Winline
 @opindex Wno-inline
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C
index 8e8ff01..282402b 100644
--- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C
+++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor11.C
@@ -2,12 +2,12 @@ 
 
 struct A
 {
-  A(int, ...);
+  A(int, ...);			// { dg-message "declared here" }
 };
 
 struct B: A
 {
-  using A::A;
+  using A::A;			// { dg-warning "ellipsis" }
 };
 
 B b1(42);