mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-25 06:18:56 -04:00

Summary: Currently Clang fails to propagate qualifiers from the `CXXThisExpr` to the rebuilt `FieldDecl` for IndirectFieldDecls. For example: ``` template <class T> struct Foo { struct { int x; }; int y; void foo() const { static_assert(__is_same(int const&, decltype((y)))); static_assert(__is_same(int const&, decltype((x)))); // assertion fails } }; template struct Foo<int>; ``` The fix is to delegate rebuilding of the MemberExpr to `BuildFieldReferenceExpr` which correctly propagates the qualifiers. Reviewers: rsmith, lebedev.ri, aaron.ballman, bkramer, rjmccall Reviewed By: rjmccall Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D45412 llvm-svn: 329517
41 lines
550 B
C++
41 lines
550 B
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
// expected-no-diagnostics
|
|
|
|
void check(int&) = delete;
|
|
void check(int const&) { }
|
|
|
|
template <typename>
|
|
struct A {
|
|
union {
|
|
int b;
|
|
};
|
|
struct {
|
|
int c;
|
|
};
|
|
union {
|
|
struct {
|
|
union {
|
|
struct {
|
|
struct {
|
|
int d;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
int e;
|
|
void foo() const {
|
|
check(b);
|
|
check(c);
|
|
check(d);
|
|
check(d);
|
|
check(e);
|
|
}
|
|
};
|
|
|
|
int main(){
|
|
A<int> a;
|
|
a.foo();
|
|
}
|