193962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor// RUN: %clang_cc1 -std=c++11 %s -verify
293962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor
3503384f731b5abcbf870b0a5224eb920e631db0aDouglas Gregorint GlobalVar; // expected-note {{declared here}}
493962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor
593962e5360a43200faa70939571afc4fb9326cf7Douglas Gregornamespace N {
693962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  int AmbiguousVar; // expected-note {{candidate}}
793962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor}
893962e5360a43200faa70939571afc4fb9326cf7Douglas Gregorint AmbiguousVar; // expected-note {{candidate}}
993962e5360a43200faa70939571afc4fb9326cf7Douglas Gregorusing namespace N;
1093962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor
1193962e5360a43200faa70939571afc4fb9326cf7Douglas Gregorclass X0 {
1293962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  int Member;
1393962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor
1493962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  static void Overload(int);
1593962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  void Overload();
1693962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  virtual X0& Overload(float);
1793962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor
1893962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  void explicit_capture() {
19503384f731b5abcbf870b0a5224eb920e631db0aDouglas Gregor    int variable; // expected-note {{declared here}}
20b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[&Overload] () {}; // expected-error {{does not name a variable}}
21b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[&GlobalVar] () {}; // expected-error {{does not have automatic storage duration}}
22b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[&AmbiguousVar] () {}; // expected-error {{reference to 'AmbiguousVar' is ambiguous}}
23b326ca8ffbea96f9cc8a457b0f57be880304a6f5Douglas Gregor    (void)[&Variable] () {}; // expected-error {{use of undeclared identifier 'Variable'; did you mean 'variable'}}
2493962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor  }
2593962e5360a43200faa70939571afc4fb9326cf7Douglas Gregor};
2673d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor
2773d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregorvoid test_reaching_scope() {
2873d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor  int local; // expected-note{{declared here}}
2973d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor  static int local_static; // expected-note{{'local_static' declared here}}
3073d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor  (void)[=]() {
3173d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor    struct InnerLocal {
3273d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor      void member() {
3373d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor        (void)[local, // expected-error{{reference to local variable 'local' declared in enclosing function 'test_reaching_scope'}}
3473d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor               local_static]() { // expected-error{{'local_static' cannot be captured because it does not have automatic storage duration}}
3573d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor          return 0;
3673d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor        };
3773d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor      }
3873d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor    };
3973d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor  };
4073d90928c0462daf0665fd7f8e44ca00d896540dDouglas Gregor}
41