diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-12-08 23:29:59 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2017-12-08 23:29:59 +0000 |
| commit | 354abec3e6b6132c9456de39951e8de0632771cc (patch) | |
| tree | 191681e24af3adddd85524ec72439ac5c192d3f5 /clang/lib/ASTMatchers/Dynamic | |
| parent | a5370fb82c8e2f9e7676a78677d2730b2512a082 (diff) | |
| download | bcm5719-llvm-354abec3e6b6132c9456de39951e8de0632771cc.tar.gz bcm5719-llvm-354abec3e6b6132c9456de39951e8de0632771cc.zip | |
Remove creation of out-of-bounds value of enumeration type (resulting in UB).
Also remove unnecessary initialization of out-parameters with this value, so
that MSan is able to catch errors appropriately.
llvm-svn: 320212
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic')
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Marshallers.h | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h index d5626b22187..af90e2c7eca 100644 --- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h @@ -122,21 +122,20 @@ template <> struct ArgTypeTraits<unsigned> { template <> struct ArgTypeTraits<attr::Kind> { private: - static attr::Kind getAttrKind(llvm::StringRef AttrKind) { - return llvm::StringSwitch<attr::Kind>(AttrKind) + static Optional<attr::Kind> getAttrKind(llvm::StringRef AttrKind) { + return llvm::StringSwitch<Optional<attr::Kind>>(AttrKind) #define ATTR(X) .Case("attr::" #X, attr:: X) #include "clang/Basic/AttrList.inc" - .Default(attr::Kind(-1)); + .Default(llvm::None); } public: static bool is(const VariantValue &Value) { - return Value.isString() && - getAttrKind(Value.getString()) != attr::Kind(-1); + return Value.isString() && getAttrKind(Value.getString()); } static attr::Kind get(const VariantValue &Value) { - return getAttrKind(Value.getString()); + return *getAttrKind(Value.getString()); } static ArgKind getKind() { @@ -146,21 +145,20 @@ public: template <> struct ArgTypeTraits<CastKind> { private: - static CastKind getCastKind(llvm::StringRef AttrKind) { - return llvm::StringSwitch<CastKind>(AttrKind) + static Optional<CastKind> getCastKind(llvm::StringRef AttrKind) { + return llvm::StringSwitch<Optional<CastKind>>(AttrKind) #define CAST_OPERATION(Name) .Case( #Name, CK_##Name) #include "clang/AST/OperationKinds.def" - .Default(CK_Invalid); + .Default(llvm::None); } public: static bool is(const VariantValue &Value) { - return Value.isString() && - getCastKind(Value.getString()) != CK_Invalid; + return Value.isString() && getCastKind(Value.getString()); } static CastKind get(const VariantValue &Value) { - return getCastKind(Value.getString()); + return *getCastKind(Value.getString()); } static ArgKind getKind() { |

