summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAriel J. Bernal <ariel.j.bernal@intel.com>2013-03-27 18:49:31 +0000
committerAriel J. Bernal <ariel.j.bernal@intel.com>2013-03-27 18:49:31 +0000
commit3f08aae84f3f6816c119ceecf59eade751132aa3 (patch)
tree223afa5a6d0b5e441eece96d5409ef0f0be6fedb
parent38a723830cee87aac2141e5c8435fce4d81406af (diff)
downloadbcm5719-llvm-3f08aae84f3f6816c119ceecf59eade751132aa3.tar.gz
bcm5719-llvm-3f08aae84f3f6816c119ceecf59eade751132aa3.zip
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 llvm-svn: 178167
-rw-r--r--clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp9
-rw-r--r--clang-tools-extra/test/cpp11-migrate/UseAuto/Inputs/test_std_container.h3
-rw-r--r--clang-tools-extra/test/cpp11-migrate/UseAuto/iterator.cpp8
3 files changed, 19 insertions, 1 deletions
diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp b/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp
index ceb22390a1f..14986d8dca9 100644
--- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp
+++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAutoActions.cpp
@@ -28,7 +28,14 @@ void UseAutoFixer::run(const MatchFinder::MatchResult &Result) {
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");
diff --git a/clang-tools-extra/test/cpp11-migrate/UseAuto/Inputs/test_std_container.h b/clang-tools-extra/test/cpp11-migrate/UseAuto/Inputs/test_std_container.h
index c0ea41bfa01..a856c45fcd2 100644
--- a/clang-tools-extra/test/cpp11-migrate/UseAuto/Inputs/test_std_container.h
+++ b/clang-tools-extra/test/cpp11-migrate/UseAuto/Inputs/test_std_container.h
@@ -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
diff --git a/clang-tools-extra/test/cpp11-migrate/UseAuto/iterator.cpp b/clang-tools-extra/test/cpp11-migrate/UseAuto/iterator.cpp
index ec1e5540759..59c2979b32e 100644
--- a/clang-tools-extra/test/cpp11-migrate/UseAuto/iterator.cpp
+++ b/clang-tools-extra/test/cpp11-migrate/UseAuto/iterator.cpp
@@ -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;
}
OpenPOWER on IntegriCloud