From: Chris Lattner Date: Sun, 29 Mar 2009 05:08:48 +0000 (+0000) Subject: Make the ActionResult optimization work for non-void*'s and switch DeclPtrTy to use it. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4656978783e444bbd4a70ead1946e341587779ca;p=clang Make the ActionResult optimization work for non-void*'s and switch DeclPtrTy to use it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67983 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index b1174672f2..84023d6678 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -47,7 +47,7 @@ namespace clang { template<> struct IsResultPtrLowBitFree<1> { static const bool value = true;}; template<> struct IsResultPtrLowBitFree<3> { static const bool value = true;}; template<> struct IsResultPtrLowBitFree<4> { static const bool value = true;}; -//template<> struct IsResultPtrLowBitFree<5> { static const bool value = true;}; + template<> struct IsResultPtrLowBitFree<5> { static const bool value = true;}; /// Action - As the parser reads the input file and recognizes the productions /// of the grammar, it invokes methods on this class to turn the parsed input diff --git a/include/clang/Parse/Ownership.h b/include/clang/Parse/Ownership.h index 1f5c4f8865..6445254aad 100644 --- a/include/clang/Parse/Ownership.h +++ b/include/clang/Parse/Ownership.h @@ -230,7 +230,13 @@ namespace clang PtrWithInvalid = reinterpret_cast(VP); assert((PtrWithInvalid & 0x01) == 0 && "Badly aligned pointer"); } - + + ActionResult(PtrTy V) { + void *VP = PtrTraits::getAsVoidPointer(V); + PtrWithInvalid = reinterpret_cast(VP); + assert((PtrWithInvalid & 0x01) == 0 && "Badly aligned pointer"); + } + ActionResult(const DiagnosticBuilder &) : PtrWithInvalid(0x01) { } PtrTy get() const { @@ -246,8 +252,9 @@ namespace clang bool isInvalid() const { return PtrWithInvalid & 0x01; } - const ActionResult &operator=(void *RHS) { - PtrWithInvalid = reinterpret_cast(RHS); + const ActionResult &operator=(PtrTy RHS) { + void *VP = PtrTraits::getAsVoidPointer(RHS); + PtrWithInvalid = reinterpret_cast(VP); assert((PtrWithInvalid & 0x01) == 0 && "Badly aligned pointer"); return *this; }