diff options
-rw-r--r-- | clang/include/clang/AST/Expr.h | 10 | ||||
-rw-r--r-- | clang/lib/AST/Expr.cpp | 15 |
2 files changed, 6 insertions, 19 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 3453cb6bdd5..0db3166002e 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -4205,18 +4205,14 @@ public: /// and array-range designators. unsigned getNumSubExprs() const { return NumSubExprs; } - Expr *getSubExpr(unsigned Idx) { + Expr *getSubExpr(unsigned Idx) const { assert(Idx < NumSubExprs && "Subscript out of range"); - char* Ptr = static_cast<char*>(static_cast<void *>(this)); - Ptr += sizeof(DesignatedInitExpr); - return reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx]; + return cast<Expr>(reinterpret_cast<Stmt *const *>(this + 1)[Idx]); } void setSubExpr(unsigned Idx, Expr *E) { assert(Idx < NumSubExprs && "Subscript out of range"); - char* Ptr = static_cast<char*>(static_cast<void *>(this)); - Ptr += sizeof(DesignatedInitExpr); - reinterpret_cast<Expr**>(reinterpret_cast<void**>(Ptr))[Idx] = E; + reinterpret_cast<Stmt **>(this + 1)[Idx] = E; } /// \brief Replaces the designator at index @p Idx with the series diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 29b9fe28ed9..649f3580bdd 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -3789,30 +3789,21 @@ SourceLocation DesignatedInitExpr::getLocEnd() const { Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) const { assert(D.Kind == Designator::ArrayDesignator && "Requires array designator"); - char *Ptr = static_cast<char *>( - const_cast<void *>(static_cast<const void *>(this))); - Ptr += sizeof(DesignatedInitExpr); - Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); + Stmt *const *SubExprs = reinterpret_cast<Stmt *const *>(this + 1); return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); } Expr *DesignatedInitExpr::getArrayRangeStart(const Designator &D) const { assert(D.Kind == Designator::ArrayRangeDesignator && "Requires array range designator"); - char *Ptr = static_cast<char *>( - const_cast<void *>(static_cast<const void *>(this))); - Ptr += sizeof(DesignatedInitExpr); - Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); + Stmt *const *SubExprs = reinterpret_cast<Stmt *const *>(this + 1); return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1)); } Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator &D) const { assert(D.Kind == Designator::ArrayRangeDesignator && "Requires array range designator"); - char *Ptr = static_cast<char *>( - const_cast<void *>(static_cast<const void *>(this))); - Ptr += sizeof(DesignatedInitExpr); - Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr)); + Stmt *const *SubExprs = reinterpret_cast<Stmt *const *>(this + 1); return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2)); } |