The search for the complete class definition can also produce entries which are not of the expected type. This can happen for instance when there is a function with the same name as the class we're looking up (which means that the class needs to be disambiguated with the struct/class tag in most contexts). Previously we were just picking the first Decl that the lookup returned, which later caused crashes or assertion failures if it was not of the correct type. This patch changes that to search for an entry of the correct type. Differential Revision: https://reviews.llvm.org/D85904
67 lines
969 B
C++
67 lines
969 B
C++
struct One {
|
|
int one = 142;
|
|
constexpr One() = default;
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two : One {
|
|
int two = 242;
|
|
constexpr Two() = default;
|
|
~Two() override;
|
|
};
|
|
|
|
namespace member {
|
|
struct One {
|
|
int member = 147;
|
|
constexpr One() = default;
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two {
|
|
One one;
|
|
int member = 247;
|
|
constexpr Two() = default;
|
|
virtual ~Two();
|
|
};
|
|
} // namespace member
|
|
|
|
namespace array {
|
|
struct One {
|
|
int member = 174;
|
|
constexpr One() = default;
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two {
|
|
One one[3];
|
|
int member = 274;
|
|
constexpr Two() = default;
|
|
virtual ~Two();
|
|
};
|
|
} // namespace array
|
|
|
|
namespace result {
|
|
struct One {
|
|
int member;
|
|
One(int member);
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two {
|
|
int member;
|
|
Two(int member);
|
|
One one() const;
|
|
virtual ~Two();
|
|
};
|
|
} // namespace result
|
|
|
|
namespace func_shadow {
|
|
void One(int);
|
|
struct One {
|
|
int one = 142;
|
|
constexpr One() = default;
|
|
virtual ~One();
|
|
};
|
|
void One(float);
|
|
} // namespace func_shadow
|