diff options
author | Fabien ChĂȘne <fabien@gcc.gnu.org> | 2014-02-02 21:02:37 +0100 |
---|---|---|
committer | Fabien ChĂȘne <fabien@gcc.gnu.org> | 2014-02-02 21:02:37 +0100 |
commit | 1c50676a2038834136ff6569f96ed0bda2a9a09c (patch) | |
tree | b5cd3b5b66192646a47ac9095f2196b774f7fca6 | |
parent | 7f82286eb63dadda3412c05f9ca7dd8e10ebaea5 (diff) | |
download | gcc-1c50676a2038834136ff6569f96ed0bda2a9a09c.zip gcc-1c50676a2038834136ff6569f96ed0bda2a9a09c.tar.gz gcc-1c50676a2038834136ff6569f96ed0bda2a9a09c.tar.bz2 |
re PR c++/37140 (type inherited from base class not recognized)
2014-02-02 Fabien Chene <fabien@gcc.gnu.org>
PR c++/37140
* parser.c (cp_parser_nonclass_name): Call strip_using_decl and
move the code handling dependent USING_DECLs...
* name-lookup.c (strip_using_decl): ...Here.
2014-02-02 Fabien Chene <fabien@gcc.gnu.org>
PR c++/37140
* g++.dg/template/using27.C: New.
* g++.dg/template/using28.C: New.
* g++.dg/template/using29.C: New.
From-SVN: r207408
-rw-r--r-- | gcc/cp/parser.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/using27.C | 33 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/using28.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/using29.C | 21 |
4 files changed, 72 insertions, 19 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index a53597d..57001c6 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -14812,25 +14812,7 @@ cp_parser_nonclass_name (cp_parser* parser) /* Look up the type-name. */ type_decl = cp_parser_lookup_name_simple (parser, identifier, token->location); - if (TREE_CODE (type_decl) == USING_DECL) - { - if (!DECL_DEPENDENT_P (type_decl)) - type_decl = strip_using_decl (type_decl); - else if (USING_DECL_TYPENAME_P (type_decl)) - { - /* We have found a type introduced by a using - declaration at class scope that refers to a dependent - type. - - using typename :: [opt] nested-name-specifier unqualified-id ; - */ - type_decl = make_typename_type (TREE_TYPE (type_decl), - DECL_NAME (type_decl), - typename_type, tf_error); - if (type_decl != error_mark_node) - type_decl = TYPE_NAME (type_decl); - } - } + type_decl = strip_using_decl (type_decl); if (TREE_CODE (type_decl) != TYPE_DECL && (objc_is_id (identifier) || objc_is_class_name (identifier))) diff --git a/gcc/testsuite/g++.dg/template/using27.C b/gcc/testsuite/g++.dg/template/using27.C new file mode 100644 index 0000000..f1835e1 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using27.C @@ -0,0 +1,33 @@ +// PR c++/37140 + +struct X +{ + typedef int nested_type; +}; + +template <class T> +struct A +{ + typedef X type; +}; + +template <class T> +struct B : A<T> +{ + using typename A<T>::type; + typename type::nested_type x; +}; + +template <class T> +struct C : B<T> +{ + using typename B<T>::type; + typename type::nested_type y; +}; + +struct D : C<int> +{ + using C<int>::type; + type::nested_type z; +}; + diff --git a/gcc/testsuite/g++.dg/template/using28.C b/gcc/testsuite/g++.dg/template/using28.C new file mode 100644 index 0000000..52f68cf --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using28.C @@ -0,0 +1,17 @@ +// PR c++/37140 + +struct C +{ + static const int block_size = 1; +}; + +template <typename T> struct A { + typedef C type; +}; + +template <typename T> struct B : public A<T> { + using typename A<T>::type; + static const int block_size = type::block_size; +}; + +template class B<int>; diff --git a/gcc/testsuite/g++.dg/template/using29.C b/gcc/testsuite/g++.dg/template/using29.C new file mode 100644 index 0000000..8726547 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using29.C @@ -0,0 +1,21 @@ +// PR c++/58047 + +template <int N> +struct print_arg { }; + +struct const_holder { + static const int CONSTANT = 42; +}; + +template <typename T> +struct identity { + typedef T type; +}; + +template <class T> +struct test_case : public identity<T> { + using typename identity<T>::type; + print_arg<type::CONSTANT> printer; +}; + +template struct test_case<const_holder>; |