diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2015-06-15 19:26:27 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2015-06-15 19:26:27 +0000 |
commit | f92c74268a1f3e9ff6921097e8da418879769e2b (patch) | |
tree | d605b269cba55a56fd16eafdd94e47cdc5fd7eef /gcc | |
parent | d7bfc710ab444e1a4e2ebe7e0ba8e39ffc3f8a08 (diff) | |
download | gcc-f92c74268a1f3e9ff6921097e8da418879769e2b.zip gcc-f92c74268a1f3e9ff6921097e8da418879769e2b.tar.gz gcc-f92c74268a1f3e9ff6921097e8da418879769e2b.tar.bz2 |
re PR c++/51048 (Class template inheritance doesn't work well with function-local types)
/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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/local-type1.C | 19 |
4 files changed, 37 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e1ca26e..cf311c7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 9df3139..ce7ab52 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d57482..68356fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..73bfd16 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/local-type1.C @@ -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()); +} |