I see, and my mistake for just reading the commit message and not the code! Thanks for the clarification.
On Mar 28, 2013, at 10:18 , "Bernal, Ariel J" <[email protected]> wrote: > Yes that's what it is supposed to do. > My mistake, in the commit message, I meant ignore expr with cleanups instead > of "skip". > > -----Original Message----- > From: Jordan Rose [mailto:[email protected]] > Sent: Thursday, March 28, 2013 12:51 PM > To: Bernal, Ariel J > Cc: [email protected] > Subject: Re: [clang-tools-extra] r178167 - cpp11-migrate segfaults > transforming map<string, int>::iterator > > Isn't the correct solution to look through ExprWithCleanups, since that won't > change the type of the returned value anyway? > > > On Mar 27, 2013, at 11:49 , Ariel J. Bernal <[email protected]> wrote: > >> Author: ajbernal >> Date: Wed Mar 27 13:49:31 2013 >> New Revision: 178167 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=178167&view=rev >> Log: >> cpp11-migrate segfaults transforming map<string,int>::iterator >> >> cpp11-migrate segfaults when -use-auto tries to resolve initializing >> expression resulting in an expression with cleanups. >> >> - Skip expressions with cleanups from the initializer >> - Added test case >> >> Fixes PR15550 >> >> >> Modified: >> clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAutoActions.cpp >> >> clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/Inputs/test_std_container.h >> clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/iterator.cpp >> >> Modified: >> clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAutoActions.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migr >> ate/UseAuto/UseAutoActions.cpp?rev=178167&r1=178166&r2=178167&view=dif >> f >> ====================================================================== >> ======== >> --- clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAutoActions.cpp >> (original) >> +++ clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAutoActions.cpp >> +++ Wed Mar 27 13:49:31 2013 >> @@ -28,7 +28,14 @@ void UseAutoFixer::run(const MatchFinder >> if (!SM.isFromMainFile(D->getLocStart())) >> return; >> >> - const CXXConstructExpr *Construct = >> cast<CXXConstructExpr>(D->getInit()); >> + const Expr *ExprInit = D->getInit(); >> + >> + // Skip expressions with cleanups from the initializer expression. >> + if (const ExprWithCleanups *E = dyn_cast<ExprWithCleanups>(ExprInit)) >> + ExprInit = E->getSubExpr(); >> + >> + const CXXConstructExpr *Construct = >> + cast<CXXConstructExpr>(ExprInit); >> + >> assert(Construct->getNumArgs() == 1u && >> "Expected constructor with single argument"); >> >> >> Modified: >> clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/Inputs/test_std_con >> tainer.h >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp11 >> -migrate/UseAuto/Inputs/test_std_container.h?rev=178167&r1=178166&r2=1 >> 78167&view=diff >> ====================================================================== >> ======== >> --- >> clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/Inputs/test_std_con >> tainer.h (original) >> +++ clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/Inputs/test_std >> +++ _container.h Wed Mar 27 13:49:31 2013 >> @@ -107,6 +107,9 @@ public: >> >> const_reverse_iterator rbegin() const { return const_reverse_iterator(); } >> const_reverse_iterator rend() const { return >> const_reverse_iterator(); } >> + >> + template <typename K> >> + iterator find(const K &Key) { return iterator(); } >> }; >> >> #if USE_INLINE_NAMESPACE >> >> Modified: >> clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/iterator.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp11 >> -migrate/UseAuto/iterator.cpp?rev=178167&r1=178166&r2=178167&view=diff >> ====================================================================== >> ======== >> --- clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/iterator.cpp >> (original) >> +++ clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/iterator.cpp >> +++ Wed Mar 27 13:49:31 2013 >> @@ -148,5 +148,13 @@ int main(int argc, char **argv) { >> // CHECK: auto && I2 = Vec.begin(); >> } >> >> + // Passing a string as an argument to introduce a temporary object >> + // that will create an expression with cleanups. Bugzilla: 15550 { >> + std::unordered_map<int> MapFind; >> + std::unordered_map<int>::iterator I = MapFind.find("foo"); >> + // CHECK: auto I = MapFind.find("foo"); } >> + >> return 0; >> } >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
