|  | // RUN: %clang_cc1 -verify -fsyntax-only %s | 
|  | // expected-no-diagnostics | 
|  |  | 
|  | struct C { | 
|  | void f() __restrict { | 
|  | static_assert(__is_same(decltype(this), C *__restrict)); | 
|  | (void) [this]() { | 
|  | static_assert(__is_same(decltype(this), C *__restrict)); | 
|  | (void) [this]() { static_assert(__is_same(decltype(this), C *__restrict)); }; | 
|  |  | 
|  | // By-value capture means 'this' is now a different object; do not | 
|  | // make it __restrict. | 
|  | (void) [*this]() { static_assert(__is_same(decltype(this), const C *)); }; | 
|  | (void) [*this]() mutable { static_assert(__is_same(decltype(this), C *)); }; | 
|  | }; | 
|  | } | 
|  | }; | 
|  |  | 
|  | template <typename T> struct TC { | 
|  | void f() __restrict { | 
|  | static_assert(__is_same(decltype(this), TC<int> *__restrict)); | 
|  | (void) [this]() { | 
|  | static_assert(__is_same(decltype(this), TC<int> *__restrict)); | 
|  | (void) [this]() { static_assert(__is_same(decltype(this), TC<int> *__restrict)); }; | 
|  |  | 
|  | // By-value capture means 'this' is now a different object; do not | 
|  | // make it __restrict. | 
|  | (void) [*this]() { static_assert(__is_same(decltype(this), const TC<int> *)); }; | 
|  | (void) [*this]() mutable { static_assert(__is_same(decltype(this), TC<int> *)); }; | 
|  | }; | 
|  | } | 
|  | }; | 
|  |  | 
|  | void f() { | 
|  | TC<int>{}.f(); | 
|  | } | 
|  |  | 
|  | namespace gh18121 { | 
|  | struct Foo { | 
|  | void member() __restrict { | 
|  | Foo *__restrict This = this; | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | namespace gh42411 { | 
|  | struct foo { | 
|  | int v; | 
|  | void f() const __restrict { | 
|  | static_assert(__is_same(decltype((v)), const int&)); | 
|  | (void) [this]() { static_assert(__is_same(decltype((v)), const int&)); }; | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | namespace gh82941 { | 
|  | void f(int& x) { | 
|  | (void)x; | 
|  | } | 
|  |  | 
|  | class C { | 
|  | int x; | 
|  | void g() __restrict; | 
|  | }; | 
|  |  | 
|  | void C::g() __restrict { | 
|  | f(this->x); | 
|  | } | 
|  | } |