From d4e5a606c9c64e24c05e5f4610796087e911fb9c Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 6 Aug 2009 21:43:54 +0000 Subject: 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 --- include/clang/Analysis/Support/Optional.h | 55 +++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 include/clang/Analysis/Support/Optional.h (limited to 'include/clang') 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 +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 +struct simplify_type > { + typedef const T* SimpleType; + static SimpleType getSimplifiedValue(const ::clang::Optional &Val) { + return Val.getPointer(); + } +}; + +template +struct simplify_type< ::clang::Optional > + : public simplify_type > {}; +} // end llvm namespace + +#endif -- cgit v1.2.3-18-g5258