diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-08-06 21:43:54 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-08-06 21:43:54 +0000 |
commit | d4e5a606c9c64e24c05e5f4610796087e911fb9c (patch) | |
tree | fd0c4cbe1d96b37cbc059684d11f0d51fd2af036 /include/clang | |
parent | 470c2a9ab6807be8a695e583a41b20ed69082260 (diff) |
Fix a couple false positive "uninitialized value" warnings with RegionStore
involving reasoning about unions (which we don't handle yet).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78342 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/clang')
-rw-r--r-- | include/clang/Analysis/Support/Optional.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/include/clang/Analysis/Support/Optional.h b/include/clang/Analysis/Support/Optional.h new file mode 100644 index 0000000000..5fb5078f76 --- /dev/null +++ b/include/clang/Analysis/Support/Optional.h @@ -0,0 +1,55 @@ +//===-- Optional.h - Simple variant for passing optional values ---*- C++ -*-=// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file provides Optional, a template class modeled in the spirit of +// OCaml's 'opt' variant. The idea is to strongly type whether or not +// a value can be optional. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_ANALYSIS_OPTIONAL +#define LLVM_CLANG_ANALYSIS_OPTIONAL + +namespace clang { + +template<typename T> +class Optional { + const T x; + unsigned hasVal : 1; +public: + explicit Optional() : hasVal(false) {} + Optional(const T &y) : x(y), hasVal(true) {} + + static inline Optional create(const T* y) { + return y ? Optional(*y) : Optional(); + } + + const T* getPointer() const { assert(hasVal); return &x; } + + operator bool() const { return hasVal; } + const T* operator->() const { return getPointer(); } + const T& operator*() const { assert(hasVal); return x; } +}; +} //end clang namespace + +namespace llvm { +template <typename T> +struct simplify_type<const ::clang::Optional<T> > { + typedef const T* SimpleType; + static SimpleType getSimplifiedValue(const ::clang::Optional<T> &Val) { + return Val.getPointer(); + } +}; + +template <typename T> +struct simplify_type< ::clang::Optional<T> > + : public simplify_type<const ::clang::Optional<T> > {}; +} // end llvm namespace + +#endif |