[LLVMbugs] [Bug 7408] Class instantiated as covariant return type of method in 'D' cannot see members declared later in 'D'

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Jul 14 17:44:38 PDT 2010


Douglas Gregor <dgregor at apple.com> changed:

           What    |Removed                     |Added
             Status|NEW                         |RESOLVED
         Resolution|                            |INVALID

--- Comment #2 from Douglas Gregor <dgregor at apple.com> 2010-07-14 19:44:38 CDT ---
(In reply to comment #1)
> Checking [class.virtual]p5 clearly requires Covariant<T> to be complete.  I
> can't seem to find anything in the standard which specifies precisely when it
> should be instantiated, though.

GCC is waiting until the class is fully defined before it checks for covariant
return types, as you can see with this modified version of the example:

struct BaseReturn {

template <typename T> struct Base{
  virtual BaseReturn* GetEdges(long n) { return 0;}

template <typename T> struct Derived;

template<typename T>
struct Covariant {
  typename Derived<T>::LaterTypedef x;

template <typename T>
struct Derived : Base<T> {
  virtual Covariant<T>* GetEdges(long n) {
    return 0;
 typedef char LaterTypedef;

  typedef T *blah;

Derived<long&> derived;

where the diagnostics for the "pointer to reference" error come before the
"invalid covariant return type" error, even though the code for the "pointer to
reference" error comes after the virtual function.

It seems to me like GCC is being overly generous, and that a user can't rely on
code that makes use of members defined later in the class. Closing as INVALID,
but I'm willing to entertain arguments that this is a real bug.

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list