]> granicus.if.org Git - clang/commitdiff
A couple minor fixes to template instantiation for for-range loops.
authorEli Friedman <eli.friedman@gmail.com>
Tue, 31 Jan 2012 22:45:40 +0000 (22:45 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Tue, 31 Jan 2012 22:45:40 +0000 (22:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149440 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaCXX/for-range-examples.cpp

index a6777ec5d8ffb1ab4b04c36d9f1f0881b04bacd8..0c0bd57b7fb119fc7f14a2c138fa2d476a4fd68d 100644 (file)
@@ -5738,10 +5738,18 @@ TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
   ExprResult Cond = getDerived().TransformExpr(S->getCond());
   if (Cond.isInvalid())
     return StmtError();
+  if (Cond.get())
+    Cond = SemaRef.CheckBooleanCondition(Cond.take(), S->getColonLoc());
+  if (Cond.isInvalid())
+    return StmtError();
+  if (Cond.get())
+    Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.take());
 
   ExprResult Inc = getDerived().TransformExpr(S->getInc());
   if (Inc.isInvalid())
     return StmtError();
+  if (Inc.get())
+    Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.take());
 
   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
   if (LoopVar.isInvalid())
index dd356032cfb8acc183b10d6bdf2432c8caa112be..868de9d4f0e9c1379d61beaff4e62a069837dcd1 100644 (file)
@@ -158,3 +158,14 @@ namespace test2 {
     for (int x : a.xs) { } // expected-error {{'xs' is a private member of 'test2::A'}}
   }
 }
+
+namespace test3 {
+  // Make sure this doesn't crash
+  struct A {};
+  struct B { ~B(); operator bool(); };
+  struct C { B operator!=(const C&); C& operator++(); int operator*(); };
+  C begin(const A&);
+  C end(const A&);
+  template<typename T> void f() { for (auto a : A()) {} }
+  void g() { f<int>(); }
+}