summaryrefslogtreecommitdiffstats
path: root/clang/lib/ASTMatchers/Dynamic
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic')
-rw-r--r--clang/lib/ASTMatchers/Dynamic/Marshallers.h11
-rw-r--r--clang/lib/ASTMatchers/Dynamic/Parser.cpp22
-rw-r--r--clang/lib/ASTMatchers/Dynamic/Registry.cpp8
-rw-r--r--clang/lib/ASTMatchers/Dynamic/VariantValue.cpp52
4 files changed, 52 insertions, 41 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h
index ae0c300d094..0df9c8cd60d 100644
--- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h
+++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h
@@ -167,13 +167,15 @@ private:
/// out of the polymorphic object.
template <class PolyMatcher>
static void mergePolyMatchers(const PolyMatcher &Poly,
- std::vector<DynTypedMatcher> &Out,
+ std::vector<const DynTypedMatcher *> &Out,
ast_matchers::internal::EmptyTypeList) {}
template <class PolyMatcher, class TypeList>
static void mergePolyMatchers(const PolyMatcher &Poly,
- std::vector<DynTypedMatcher> &Out, TypeList) {
- Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly));
+ std::vector<const DynTypedMatcher *> &Out,
+ TypeList) {
+ Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly)
+ .clone());
mergePolyMatchers(Poly, Out, typename TypeList::tail());
}
@@ -191,9 +193,10 @@ template <typename T>
static VariantMatcher outvalueToVariantMatcher(const T &PolyMatcher,
typename T::ReturnTypes * =
NULL) {
- std::vector<DynTypedMatcher> Matchers;
+ std::vector<const DynTypedMatcher *> Matchers;
mergePolyMatchers(PolyMatcher, Matchers, typename T::ReturnTypes());
VariantMatcher Out = VariantMatcher::PolymorphicMatcher(Matchers);
+ llvm::DeleteContainerPointers(Matchers);
return Out;
}
diff --git a/clang/lib/ASTMatchers/Dynamic/Parser.cpp b/clang/lib/ASTMatchers/Dynamic/Parser.cpp
index df9596e9b93..37e6c10478c 100644
--- a/clang/lib/ASTMatchers/Dynamic/Parser.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/Parser.cpp
@@ -390,29 +390,29 @@ bool Parser::parseExpression(StringRef Code, Sema *S,
return true;
}
-llvm::Optional<DynTypedMatcher>
-Parser::parseMatcherExpression(StringRef Code, Diagnostics *Error) {
+DynTypedMatcher *Parser::parseMatcherExpression(StringRef Code,
+ Diagnostics *Error) {
RegistrySema S;
return parseMatcherExpression(Code, &S, Error);
}
-llvm::Optional<DynTypedMatcher>
-Parser::parseMatcherExpression(StringRef Code, Parser::Sema *S,
- Diagnostics *Error) {
+DynTypedMatcher *Parser::parseMatcherExpression(StringRef Code,
+ Parser::Sema *S,
+ Diagnostics *Error) {
VariantValue Value;
if (!parseExpression(Code, S, &Value, Error))
- return llvm::Optional<DynTypedMatcher>();
+ return NULL;
if (!Value.isMatcher()) {
Error->addError(SourceRange(), Error->ET_ParserNotAMatcher);
- return llvm::Optional<DynTypedMatcher>();
+ return NULL;
}
- llvm::Optional<DynTypedMatcher> Result =
- Value.getMatcher().getSingleMatcher();
- if (!Result.hasValue()) {
+ const DynTypedMatcher *Result;
+ if (!Value.getMatcher().getSingleMatcher(Result)) {
Error->addError(SourceRange(), Error->ET_ParserOverloadedType)
<< Value.getTypeAsString();
+ return NULL;
}
- return Result;
+ return Result->clone();
}
} // namespace dynamic
diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
index 3a17038d985..3f8e7d4cd9d 100644
--- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp
@@ -329,10 +329,10 @@ VariantMatcher Registry::constructBoundMatcher(StringRef MatcherName,
VariantMatcher Out = constructMatcher(MatcherName, NameRange, Args, Error);
if (Out.isNull()) return Out;
- llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher();
- if (Result.hasValue()) {
- llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
- if (Bound.hasValue()) {
+ const DynTypedMatcher *Result;
+ if (Out.getSingleMatcher(Result)) {
+ OwningPtr<DynTypedMatcher> Bound(Result->tryBind(BindID));
+ if (Bound) {
return VariantMatcher::SingleMatcher(*Bound);
}
}
diff --git a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
index 3e49e1b8ef0..c350d78aa14 100644
--- a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
@@ -26,37 +26,44 @@ VariantMatcher::Payload::~Payload() {}
class VariantMatcher::SinglePayload : public VariantMatcher::Payload {
public:
- SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher) {}
+ SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher.clone()) {}
- virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const {
- return Matcher;
+ virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const {
+ Out = Matcher.get();
+ return true;
}
virtual std::string getTypeAsString() const {
- return (Twine("Matcher<") + Matcher.getSupportedKind().asStringRef() + ">")
+ return (Twine("Matcher<") + Matcher->getSupportedKind().asStringRef() + ">")
.str();
}
virtual void makeTypedMatcher(MatcherOps &Ops) const {
- if (Ops.canConstructFrom(Matcher))
- Ops.constructFrom(Matcher);
+ if (Ops.canConstructFrom(*Matcher))
+ Ops.constructFrom(*Matcher);
}
private:
- const DynTypedMatcher Matcher;
+ OwningPtr<const DynTypedMatcher> Matcher;
};
class VariantMatcher::PolymorphicPayload : public VariantMatcher::Payload {
public:
- PolymorphicPayload(ArrayRef<DynTypedMatcher> MatchersIn)
- : Matchers(MatchersIn) {}
+ PolymorphicPayload(ArrayRef<const DynTypedMatcher *> MatchersIn) {
+ for (size_t i = 0, e = MatchersIn.size(); i != e; ++i) {
+ Matchers.push_back(MatchersIn[i]->clone());
+ }
+ }
- virtual ~PolymorphicPayload() {}
+ virtual ~PolymorphicPayload() {
+ llvm::DeleteContainerPointers(Matchers);
+ }
- virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const {
+ virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const {
if (Matchers.size() != 1)
- return llvm::Optional<DynTypedMatcher>();
- return Matchers[0];
+ return false;
+ Out = Matchers[0];
+ return true;
}
virtual std::string getTypeAsString() const {
@@ -64,7 +71,7 @@ public:
for (size_t i = 0, e = Matchers.size(); i != e; ++i) {
if (i != 0)
Inner += "|";
- Inner += Matchers[i].getSupportedKind().asStringRef();
+ Inner += Matchers[i]->getSupportedKind().asStringRef();
}
return (Twine("Matcher<") + Inner + ">").str();
}
@@ -72,17 +79,17 @@ public:
virtual void makeTypedMatcher(MatcherOps &Ops) const {
const DynTypedMatcher *Found = NULL;
for (size_t i = 0, e = Matchers.size(); i != e; ++i) {
- if (Ops.canConstructFrom(Matchers[i])) {
+ if (Ops.canConstructFrom(*Matchers[i])) {
if (Found)
return;
- Found = &Matchers[i];
+ Found = Matchers[i];
}
}
if (Found)
Ops.constructFrom(*Found);
}
- const std::vector<DynTypedMatcher> Matchers;
+ std::vector<const DynTypedMatcher *> Matchers;
};
class VariantMatcher::VariadicOpPayload : public VariantMatcher::Payload {
@@ -91,8 +98,8 @@ public:
ArrayRef<VariantMatcher> Args)
: Func(Func), Args(Args) {}
- virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const {
- return llvm::Optional<DynTypedMatcher>();
+ virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const {
+ return false;
}
virtual std::string getTypeAsString() const {
@@ -121,7 +128,7 @@ VariantMatcher VariantMatcher::SingleMatcher(const DynTypedMatcher &Matcher) {
}
VariantMatcher
-VariantMatcher::PolymorphicMatcher(ArrayRef<DynTypedMatcher> Matchers) {
+VariantMatcher::PolymorphicMatcher(ArrayRef<const DynTypedMatcher *> Matchers) {
return VariantMatcher(new PolymorphicPayload(Matchers));
}
@@ -131,8 +138,9 @@ VariantMatcher VariantMatcher::VariadicOperatorMatcher(
return VariantMatcher(new VariadicOpPayload(Func, Args));
}
-llvm::Optional<DynTypedMatcher> VariantMatcher::getSingleMatcher() const {
- return Value ? Value->getSingleMatcher() : llvm::Optional<DynTypedMatcher>();
+bool VariantMatcher::getSingleMatcher(const DynTypedMatcher *&Out) const {
+ if (Value) return Value->getSingleMatcher(Out);
+ return false;
}
void VariantMatcher::reset() { Value.reset(); }
OpenPOWER on IntegriCloud