[clang-tools-extra] r178167 - cpp11-migrate segfaults transforming map<string, int>::iterator

Jordan Rose jordan_rose at apple.com
Thu Mar 28 09:50:43 PDT 2013


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 <ariel.j.bernal at intel.com> 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-migrate/UseAuto/UseAutoActions.cpp?rev=178167&r1=178166&r2=178167&view=diff
> ==============================================================================
> --- 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_container.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=178167&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/test/cpp11-migrate/UseAuto/Inputs/test_std_container.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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list