aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-06-21 23:07:19 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-06-21 23:07:19 +0000
commitcd6f36693ed40cef8c8639c04438d865187c1f73 (patch)
tree1637a9d3c8ffe5b210550a799d9f354e01509fcb
parenta72a12f3baed07f2663e48c5fc3b670c68dffe0c (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.cpp3
-rw-r--r--test/SemaCXX/for-range-unused.cpp22
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}}
+}