view gcc/testsuite/g++.dg/lookup/pr87531.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

// PR c+/87531 lookup of operator= in templates
// { dg-do run }

struct Base {
  void operator= (Base const&);
};

void Base::operator= (Base const &)
{
}

template <typename T>
struct Derived : Base
{
  T v;

  Derived() : v (0) {}
  Derived(T v_) : v (v_) {}

  T &assign1 (Derived const& rhs)
  {
    operator=(rhs); // erroneously bound to Base::operator=
    return v;
  }

  T &assign2 (Derived const& rhs)
  {
    this->operator=(rhs); // erroneously bound to Base::operator=
    return v;
  }
};

template <typename T>
struct Single
{
  T v;

  Single () : v (0) {}
  Single (T v_) : v (v_) {}

  T &assign1 (Single const& rhs)
  {
    operator=(rhs); // lookup failed
    return v;
  }

  T &assign2 (Single const& rhs)
  {
    this->operator=(rhs); // Marked as dependent, happened to work
    return v;
  }
};

int main()
{
  Derived<int> a, b(123);

  if (a.assign1 (b) != 123)
    return 1;

  if (a.assign2 (b) != 123)
    return 2;

  Single<int> c, d(123);
  
  if (c.assign1 (d) != 123)
    return 3;

  if (c.assign2 (d) != 123)
    return 4;

  return 0;
}