[PATCH] Have LoopConvert use 'auto &&' where necessary

Dmitri Gribenko gribozavr at gmail.com
Wed Mar 6 12:22:28 PST 2013


  By the way, what about operator* returning T&&?  This is completely crazy, but we should do something sane in this case -- like avoiding the transformation.


================
Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:771-775
@@ -769,4 +770,7 @@
 
-  QualType AutoRefType =
-      Context->getLValueReferenceType(Context->getAutoDeductType());
+  QualType AutoRefType = Context->getAutoDeductType();
+  if (DerefByValue)
+    AutoRefType = Context->getRValueReferenceType(AutoRefType);
+  else
+    AutoRefType = Context->getLValueReferenceType(AutoRefType);
 
----------------
Please add a comment here. Something like:

If iterator's operator * returns 'T&', we can bind it to 'auto&'.  If it returns 'T', we can bind this rvalue to 'auto&&', which will deduce 'T&&'.

================
Comment at: cpp11-migrate/LoopConvert/LoopMatchers.cpp:145-146
@@ +144,4 @@
+  internal::Matcher<VarDecl> testDerefReturnsByValue =
+      hasType(
+        recordDecl(
+          hasMethod(
----------------
What if iterator has a pointer type?


http://llvm-reviews.chandlerc.com/D500



More information about the cfe-commits mailing list