http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59703

            Bug ID: 59703
           Summary: using declaration in class mishandles type aliases
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pab at pabigot dot com

The code below generates this diagnostic with gcc 4.8.2 and 4.9.0:

    llc[127]$ /usr/local/gcc/bin/g++ -std=c++11 -c using.cc
    using.cc:21:30: error: ‘string_type’ is not a class, namespace, or
enumeration
       using size_type = typename string_type::size_type;
                                  ^
    using.cc:23:3: error: ‘size_type’ does not name a type
       size_type big () const {
       ^
    using.cc: In function ‘size_t checkit()’:
    using.cc:31:12: error: ‘class derived<std::basic_string<char> >’ has no
member named ‘big’
       return x.big();
                ^
The code is accepted by clang++ 3.4, and I can find nothing in the standard
that indicates it's incorrect.  The functionally similar type alias works.

#include <string>

template <typename S>
class base {
public:
  using string_type = S;
};

template <typename S>
class derived : public base<S> {
  using super_ = base<S>;
public:
#if 0
  /* These work */
  //using string_type = S;
  using string_type = typename super_::string_type;
#else
  /* This does not work */
  using typename super_::string_type;
#endif
  using size_type = typename string_type::size_type;

  size_type big () const {
    return string_type::npos;
  }
};

size_t checkit ()
{
  derived<std::string> x;
  return x.big();
}

Reply via email to