https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85060

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |rejects-valid, wrong-code
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-03-24
      Known to work|                            |6.4.0
            Summary|Object cannot call its      |[7/8 Regression] Object
                   |inherited member function   |cannot call its inherited
                   |"without object"            |member function "without
                   |                            |object"
     Ever confirmed|0                           |1
      Known to fail|                            |7.3.0

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Confirmed:

struct CA {
  int foo() { return 42; }
};

template <class T>
struct CB : CA { };

template <class T>
struct CC : CB<T> {
  int bar() {
    const int m = CA::foo();
    return m;
  }

  int baz() {
    const T m = CA::foo();
    return m;
  }
};

int main() {
  CC<double> c;
  __builtin_printf("%d %d\n", c.bar(), c.baz());
}


This fails to compile with gcc-7:

85060.cc: In member function 'int CC<T>::bar()':
85060.cc:11:26: error: cannot call member function 'int CA::foo()' without
object
     const int m = CA::foo();
                   ~~~~~~~^~

It compiles with gcc-8 but warns about an uninitialized variable, and prints
garbage:

1078263808 42



So rejects-valid with gcc-7-branch and wrong-code with trunk.

Reply via email to