aboutsummaryrefslogtreecommitdiffstats
path: root/testing/creduce/fix-crash-due-to-overwriting-same-location.patch
diff options
context:
space:
mode:
Diffstat (limited to 'testing/creduce/fix-crash-due-to-overwriting-same-location.patch')
-rw-r--r--testing/creduce/fix-crash-due-to-overwriting-same-location.patch118
1 files changed, 0 insertions, 118 deletions
diff --git a/testing/creduce/fix-crash-due-to-overwriting-same-location.patch b/testing/creduce/fix-crash-due-to-overwriting-same-location.patch
deleted file mode 100644
index 25d7baa8d1..0000000000
--- a/testing/creduce/fix-crash-due-to-overwriting-same-location.patch
+++ /dev/null
@@ -1,118 +0,0 @@
-From 30c2d8e3a6505ed6699216833441eccaeedf02ad Mon Sep 17 00:00:00 2001
-From: Yang Chen <chenyang@cs.utah.edu>
-Date: Sat, 14 Jan 2017 02:08:05 -0800
-Subject: [PATCH] Fixed a crash due to overwriting the same location
-
-In some cases (most likely for ill-declared templates),
-we may rewrite the same location multiple times, and
-hence trigger an ICE. This is now fixed.
-
-Upstream-Commit: https://github.com/csmith-project/creduce/commit/30c2d8e3a6505ed6699216833441eccaeedf02ad
----
- clang_delta/RemoveUnusedFunction.cpp | 23 ++++++++++++++++++++++-
- clang_delta/RemoveUnusedFunction.h | 7 ++++++-
- 2 files changed, 28 insertions(+), 2 deletions(-)
-
-diff --git a/clang_delta/RemoveUnusedFunction.cpp b/clang_delta/RemoveUnusedFunction.cpp
-index f9be26f..b38fe51 100644
---- a/clang_delta/RemoveUnusedFunction.cpp
-+++ b/clang_delta/RemoveUnusedFunction.cpp
-@@ -388,6 +388,8 @@ SourceLocation RemoveUnusedFunction::getFunctionOuterLocStart(
- const FunctionDecl *FD)
- {
- SourceLocation LocStart = FD->getLocStart();
-+ bool RecordLoc = false;
-+
- // check if FD is from a function template
- if (FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate()) {
- // get FTD->getLocStart() only if it is less than FD->getLocStart,
-@@ -396,8 +398,10 @@ SourceLocation RemoveUnusedFunction::getFunctionOuterLocStart(
- // template<typename T> template<typename T1> void S<T>::foo() { }
- // where
- // FTD->getLocStart() points to the begining of "template<typename T1>"
-- if (hasValidOuterLocStart(FTD, FD))
-+ if (hasValidOuterLocStart(FTD, FD)) {
- LocStart = FTD->getLocStart();
-+ RecordLoc = true;
-+ }
- }
-
- if (LocStart.isMacroID())
-@@ -406,6 +410,17 @@ SourceLocation RemoveUnusedFunction::getFunctionOuterLocStart(
- // this is ugly, but how do we get the location of __extension__? e.g.:
- // __extension__ void foo();
- LocStart = getExtensionLocStart(LocStart);
-+
-+ // In some cases where the given input is not well-formed, we may
-+ // end up with duplicate locations for the FunctionTemplateDecl
-+ // case. In such cases, we simply return an invalid SourceLocation,
-+ // which will ben skipped by the caller of getFunctionOuterLocStart.
-+ if (RecordLoc) {
-+ if (VisitedLocations.count(LocStart))
-+ return SourceLocation();
-+ VisitedLocations.insert(LocStart);
-+ }
-+
- return LocStart;
- }
-
-@@ -468,6 +483,8 @@ void RemoveUnusedFunction::removeOneFunctionDecl(const FunctionDecl *FD)
- LocEnd = SrcManager->getExpansionLoc(LocEnd);
- if (!FD->isInExternCContext() && !FD->isInExternCXXContext()) {
- SourceLocation FuncLocStart = getFunctionOuterLocStart(FD);
-+ if (FuncLocStart.isInvalid())
-+ return;
- LocEnd = getFunctionLocEnd(FuncLocStart, LocEnd, FD);
- if (SrcManager->isWrittenInMainFile(FuncLocStart) &&
- SrcManager->isWrittenInMainFile(LocEnd))
-@@ -479,6 +496,8 @@ void RemoveUnusedFunction::removeOneFunctionDecl(const FunctionDecl *FD)
- const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(Ctx);
- if (!Linkage) {
- SourceLocation FuncLocStart = getFunctionOuterLocStart(FD);
-+ if (FuncLocStart.isInvalid())
-+ return;
- LocEnd = getFunctionLocEnd(FuncLocStart, LocEnd, FD);
- TheRewriter.RemoveText(SourceRange(FuncLocStart, LocEnd));
- return;
-@@ -488,6 +507,8 @@ void RemoveUnusedFunction::removeOneFunctionDecl(const FunctionDecl *FD)
- // namespace { using ::foo; }
- if (Linkage->hasBraces()) {
- SourceLocation FuncLocStart = getFunctionOuterLocStart(FD);
-+ if (FuncLocStart.isInvalid())
-+ return;
- TheRewriter.RemoveText(SourceRange(FuncLocStart, LocEnd));
- return;
- }
-diff --git a/clang_delta/RemoveUnusedFunction.h b/clang_delta/RemoveUnusedFunction.h
-index d724aeb..ded12d7 100644
---- a/clang_delta/RemoveUnusedFunction.h
-+++ b/clang_delta/RemoveUnusedFunction.h
-@@ -14,8 +14,9 @@
- #include <string>
- #include <map>
- #include <set>
--#include "llvm/ADT/SmallPtrSet.h"
- #include "llvm/ADT/DenseMap.h"
-+#include "llvm/ADT/SmallPtrSet.h"
-+#include "llvm/ADT/SmallSet.h"
- #include "Transformation.h"
- #include "clang/Basic/SourceLocation.h"
-
-@@ -98,6 +99,8 @@ friend class ExtraReferenceVisitorWrapper;
-
- typedef std::set<std::string> SystemFunctionsSet;
-
-+ typedef llvm::SmallSet<clang::SourceLocation, 5> LocSet;
-+
- virtual void Initialize(clang::ASTContext &context);
-
- virtual void HandleTranslationUnit(clang::ASTContext &Ctx);
-@@ -188,6 +191,8 @@ friend class ExtraReferenceVisitorWrapper;
-
- SystemFunctionsSet ExistingSystemFunctions;
-
-+ LocSet VisitedLocations;
-+
- FunctionDeclVector AllValidFunctionDecls;
-
- RUFAnalysisVisitor *AnalysisVisitor;