re PR c++/51048 (Class template inheritance doesn't work well with function-local...
authorPaolo Carlini <paolo@gcc.gnu.org>
Mon, 15 Jun 2015 19:26:27 +0000 (19:26 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 15 Jun 2015 19:26:27 +0000 (19:26 +0000)
/cp
2015-06-15  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51048
* decl2.c (no_linkage_error): Do not issue a permerror if the DECL
using a local type is pure virtual.

/testsuite
2015-06-15  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/51048
* g++.dg/cpp0x/local-type1.C: New.

From-SVN: r224492

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/local-type1.C [new file with mode: 0644]

index e1ca26ebeed05408fc4a8e26077eb9b41944ae07..cf311c731785da8094ece51ab76de2326b6c4e63 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-15  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51048
+       * decl2.c (no_linkage_error): Do not issue a permerror if the DECL
+       using a local type is pure virtual.
+
 2015-06-13  Patrick Palka  <ppalka@gcc.gnu.org>
 
        * call.c: Remove comment documenting the long-deleted
index 9df3139e9e37916cc6f8c64c2af346237dae1c9b..ce7ab52c28b3ad17c8000f15f59be41b7a55455a 100644 (file)
@@ -4221,8 +4221,12 @@ no_linkage_error (tree decl)
                TYPE_NAME (t));
     }
   else if (cxx_dialect >= cxx11)
-    permerror (DECL_SOURCE_LOCATION (decl), "%q#D, declared using local type "
-              "%qT, is used but never defined", decl, t);
+    {
+      if (TREE_CODE (decl) == VAR_DECL || !DECL_PURE_VIRTUAL_P (decl))
+       permerror (DECL_SOURCE_LOCATION (decl),
+                  "%q#D, declared using local type "
+                  "%qT, is used but never defined", decl, t);
+    }
   else if (TREE_CODE (decl) == VAR_DECL)
     warning_at (DECL_SOURCE_LOCATION (decl), 0, "type %qT with no linkage "
                "used to declare variable %q#D with linkage", t, decl);
index 0d574821068a0f12a9cb764fa715aba25f1d9fce..68356fc31e3c1ac96813bef688f2ba5e232104d3 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-15  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/51048
+       * g++.dg/cpp0x/local-type1.C: New.
+
 2015-06-15  Andre Vehreschild  <vehre@gmx.de>
 
        PR fortran/44672
@@ -11,7 +16,7 @@
 2015-06-13  Patrick Palka  <ppalka@gcc.gnu.org>
 
        PR c++/65168
-       g++.dg/warn/Walways-true-3.C: New test.
+       g++.dg/warn/Walways-true-3.C: New test.
 
 2015-06-13  Tom de Vries  <tom@codesourcery.com>
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/local-type1.C b/gcc/testsuite/g++.dg/cpp0x/local-type1.C
new file mode 100644 (file)
index 0000000..73bfd16
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/51048
+// { dg-do compile { target c++11 } }
+
+template<typename X>
+struct A {
+  virtual void DoPush(X const& x) = 0;
+  void Push(X const& x) { DoPush(x); }
+};
+
+template<typename X>
+struct B : A<X> {
+  using A<X>::Push;
+  virtual void DoPush(X const&) { }
+};
+
+int main() {
+  enum S { };
+  B<S>().Push(S());
+}