Fix for PR28523: unexpected compilation error.
authorAlexey Bataev <a.bataev@hotmail.com>
Fri, 11 Nov 2016 12:36:20 +0000 (12:36 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Fri, 11 Nov 2016 12:36:20 +0000 (12:36 +0000)
commit31939e39db2ca3f26868f1f961be0e6c9026a45c
treea0bd1889030cc7429def9f841ae3aca8002d998b
parentcdfdff0b182a8a4a06ba99d7410f0d129b743a45
Fix for PR28523: unexpected compilation error.

Clang emits error message for the following code:
```
template <class F> void parallel_loop(F &&f) { f(0); }

int main() {
  int x;
  parallel_loop([&](auto y) {
    {
      x = y;
    };
  });
}
```

$ clang++ --std=gnu++14 clang_test.cc -o clang_test
clang_test.cc:9:7: error: reference to local variable 'x' declared in enclosing function 'main'
      x = y;
            ^
clang_test.cc:2:48: note: in instantiation of function template specialization 'main()::(anonymous class)::operator()<int>' requested here
            template <class F> void parallel_loop(F &&f) { f(0); }
                                                           ^
clang_test.cc:6:3: note: in instantiation of function template specialization 'parallel_loop<(lambda at clang_test.cc:6:17)>' requested here parallel_loop([&](auto y) {
           ^
clang_test.cc:5:7: note: 'x' declared here
      int x;
          ^
1 error generated.

Patch fixes this issue.

llvm-svn: 286584
clang/include/clang/Sema/Sema.h
clang/lib/Sema/Sema.cpp
clang/lib/Sema/SemaExpr.cpp
clang/lib/Sema/SemaExprCXX.cpp
clang/lib/Sema/SemaLambda.cpp
clang/test/CodeGenCXX/PR28523.cpp [new file with mode: 0644]