diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-06-21 23:07:19 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-06-21 23:07:19 +0000 |
commit | cd6f36693ed40cef8c8639c04438d865187c1f73 (patch) | |
tree | 1637a9d3c8ffe5b210550a799d9f354e01509fcb | |
parent | a72a12f3baed07f2663e48c5fc3b670c68dffe0c (diff) |
First part of PR9968: the __range variable in a dependent C++11 for-range statement is implicitly used by that statement.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133572 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 3 | ||||
-rw-r--r-- | test/SemaCXX/for-range-unused.cpp | 22 |
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 9af9c8de1b..0ba4f99abc 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -1406,6 +1406,9 @@ Sema::BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation ColonLoc, if (LoopVar->isInvalidDecl()) NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin); } + } else { + // The range is implicitly used as a placeholder when it is dependent. + RangeVar->setUsed(); } return Owned(new (Context) CXXForRangeStmt(RangeDS, diff --git a/test/SemaCXX/for-range-unused.cpp b/test/SemaCXX/for-range-unused.cpp new file mode 100644 index 0000000000..7e26c786ed --- /dev/null +++ b/test/SemaCXX/for-range-unused.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++0x -Wunused + +// PR9968: We used to warn that __range is unused in a dependent for-range. + +template <typename T> + struct Vector { + void doIt() { + // FIXME: PR10168: Only warn once for this! + int a; // expected-warning 2{{unused variable 'a'}} + + for (auto& e : elements) + ; + } + + T elements[10]; + }; + + +int main(int, char**) { + Vector<int> vector; + vector.doIt(); // expected-note {{requested here}} +} |