Compiler projects using llvm
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s

struct S {
  S *p = this; // ok
  decltype(this) q; // expected-error {{invalid use of 'this' outside of a non-static member function}}

  int arr[sizeof(this)]; // expected-error {{invalid use of 'this' outside of a non-static member function}}
  int sz = sizeof(this); // ok

  typedef auto f() -> decltype(this); // expected-error {{invalid use of 'this' outside of a non-static member function}}
};

namespace CaptureThis {
  struct X {
    int n = 10;
    int m = [&]{return n + 1; }();
    int o = [&]{return this->m + 1; }();
    int p = [&]{return [&](int x) { return this->m + x;}(o); }();
  };
  
  X x;
}