teak-llvm/clang/test/SemaCXX/PR22637.cpp
Eric Fiselier 84393619eb [Sema] Fix PR22637 - IndirectFieldDecl's discard qualifiers during template instantiation.
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
2018-04-08 05:11:59 +00:00

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();
}