This code makes the assumption that dereferencing the iterator returned by container.begin() produces a type that's convertible to a const version of the type returned by dereferencing the iterator type of the loop variable. Remember in our discussions there were three cases:
# The type returned by dereferencing the iterator type of the variable declaration and the type returned by dereferencing the iterator type of the loop variable's initializer are **identical**. # As above except we allow the former type to be const. # The types otherwise are not the same. Case #3 should not be transformed at all. Case #2 is what you're trying to handle by adding `const`. Case #1 is ok to transform. ================ Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:1008 @@ +1007,3 @@ + // returns a const reference or not. + const QualType *IteratorType = + Nodes.getNodeAs<QualType>(DerefByRefResultName); ---------------- This would be more accurately described as "DerefType" not iterator type. ================ Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:1012 @@ +1011,3 @@ + const ReferenceType *IteratorReferenceType = + IteratorType->getTypePtr()->getAs<ReferenceType>(); + IteratorPointsToConst = ---------------- QualType's operator->() provides Type. Just say (*IteratorType)->getAs... ================ Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:1013 @@ +1012,3 @@ + IteratorType->getTypePtr()->getAs<ReferenceType>(); + IteratorPointsToConst = + IteratorReferenceType->getPointeeType().isConstQualified(); ---------------- Given the context perhaps a better name for this variable is then DerefByConstRef. ================ Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:1019 @@ +1018,3 @@ + QualType PointerType = InitVar->getType(); + assert(PointerType.getTypePtr()->isPointerType() && + "Non-class iterator type is not a pointer type."); ---------------- Another case of just using QualType::operator->(). ================ Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:1017 @@ +1016,3 @@ + // For non-class iterator types, check if the pointee type is const or + // not. + QualType PointerType = InitVar->getType(); ---------------- We should talk about why this else case gets triggered. Should include the fact that the matcher won't tag an expression with either DerefByValue or DerefByRef if the iterator is a plain pointer. ================ Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:1018 @@ +1017,3 @@ + // not. + QualType PointerType = InitVar->getType(); + assert(PointerType.getTypePtr()->isPointerType() && ---------------- I'd also call this "InitVarType". ================ Comment at: cpp11-migrate/LoopConvert/LoopActions.cpp:1022 @@ +1021,3 @@ + QualType CanonicalPointerType = PointerType.getCanonicalType(); + IteratorPointsToConst = CanonicalPointerType.getTypePtr() + ->getPointeeType().isConstQualified(); ---------------- Another QualType::operator->() use case. http://llvm-reviews.chandlerc.com/D641 _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
