Skip to content

Commit 4939165

Browse files
committedJan 9, 2019
[AST] Move back BasePathSize to the bit-fields of CastExpr
The number of trailing CXXBaseSpecifiers in CastExpr was moved from CastExprBitfields to a trailing object in r338489 (D50050). At this time these bit-fields classes were only 32 bits wide. However later r345459 widened these bit-field classes to 64 bits. The reason for this change was that on 64 bit archs alignment requirements caused 4 bytes of padding after the Stmt sub-object in nearly all expression classes. Reusing this padding yielded an >10% reduction in the size used by all statement/expressions when parsing all of Boost (on a 64 bit arch). This increased the size of statement/expressions for 32 bits archs, but this can be mitigated by moving more data to the bit-fields of Stmt (and moreover most people now care about 64 bits archs as a host). Therefore move back the number of CXXBaseSpecifiers in CastExpr to the bit-fields of Stmt. This in effect mostly revert r338489 while keeping the added test. Differential Revision: https://reviews.llvm.org/D56358 Reviewed By: lebedev.ri Reviewers: lebedev.ri, rjmccall llvm-svn: 350741
1 parent cb4e59e commit 4939165

File tree

6 files changed

+32
-125
lines changed

6 files changed

+32
-125
lines changed
 

‎clang/include/clang/AST/Expr.h

+11-38
Original file line numberDiff line numberDiff line change
@@ -2996,28 +2996,15 @@ class CompoundLiteralExpr : public Expr {
29962996
/// representation in the source code (ExplicitCastExpr's derived
29972997
/// classes).
29982998
class CastExpr : public Expr {
2999-
public:
3000-
using BasePathSizeTy = unsigned int;
3001-
static_assert(std::numeric_limits<BasePathSizeTy>::max() >= 16384,
3002-
"[implimits] Direct and indirect base classes [16384].");
3003-
3004-
private:
30052999
Stmt *Op;
30063000

30073001
bool CastConsistency() const;
30083002

3009-
BasePathSizeTy *BasePathSize();
3010-
30113003
const CXXBaseSpecifier * const *path_buffer() const {
30123004
return const_cast<CastExpr*>(this)->path_buffer();
30133005
}
30143006
CXXBaseSpecifier **path_buffer();
30153007

3016-
void setBasePathSize(BasePathSizeTy basePathSize) {
3017-
assert(!path_empty() && basePathSize != 0);
3018-
*(BasePathSize()) = basePathSize;
3019-
}
3020-
30213008
protected:
30223009
CastExpr(StmtClass SC, QualType ty, ExprValueKind VK, const CastKind kind,
30233010
Expr *op, unsigned BasePathSize)
@@ -3038,19 +3025,19 @@ class CastExpr : public Expr {
30383025
Op(op) {
30393026
CastExprBits.Kind = kind;
30403027
CastExprBits.PartOfExplicitCast = false;
3041-
CastExprBits.BasePathIsEmpty = BasePathSize == 0;
3042-
if (!path_empty())
3043-
setBasePathSize(BasePathSize);
3028+
CastExprBits.BasePathSize = BasePathSize;
3029+
assert((CastExprBits.BasePathSize == BasePathSize) &&
3030+
"BasePathSize overflow!");
30443031
assert(CastConsistency());
30453032
}
30463033

30473034
/// Construct an empty cast.
30483035
CastExpr(StmtClass SC, EmptyShell Empty, unsigned BasePathSize)
30493036
: Expr(SC, Empty) {
30503037
CastExprBits.PartOfExplicitCast = false;
3051-
CastExprBits.BasePathIsEmpty = BasePathSize == 0;
3052-
if (!path_empty())
3053-
setBasePathSize(BasePathSize);
3038+
CastExprBits.BasePathSize = BasePathSize;
3039+
assert((CastExprBits.BasePathSize == BasePathSize) &&
3040+
"BasePathSize overflow!");
30543041
}
30553042

30563043
public:
@@ -3077,13 +3064,9 @@ class CastExpr : public Expr {
30773064
NamedDecl *getConversionFunction() const;
30783065

30793066
typedef CXXBaseSpecifier **path_iterator;
3080-
typedef const CXXBaseSpecifier * const *path_const_iterator;
3081-
bool path_empty() const { return CastExprBits.BasePathIsEmpty; }
3082-
unsigned path_size() const {
3083-
if (path_empty())
3084-
return 0U;
3085-
return *(const_cast<CastExpr *>(this)->BasePathSize());
3086-
}
3067+
typedef const CXXBaseSpecifier *const *path_const_iterator;
3068+
bool path_empty() const { return path_size() == 0; }
3069+
unsigned path_size() const { return CastExprBits.BasePathSize; }
30873070
path_iterator path_begin() { return path_buffer(); }
30883071
path_iterator path_end() { return path_buffer() + path_size(); }
30893072
path_const_iterator path_begin() const { return path_buffer(); }
@@ -3131,13 +3114,8 @@ class CastExpr : public Expr {
31313114
/// @endcode
31323115
class ImplicitCastExpr final
31333116
: public CastExpr,
3134-
private llvm::TrailingObjects<ImplicitCastExpr, CastExpr::BasePathSizeTy,
3135-
CXXBaseSpecifier *> {
3136-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
3137-
return path_empty() ? 0 : 1;
3138-
}
3117+
private llvm::TrailingObjects<ImplicitCastExpr, CXXBaseSpecifier *> {
31393118

3140-
private:
31413119
ImplicitCastExpr(QualType ty, CastKind kind, Expr *op,
31423120
unsigned BasePathLength, ExprValueKind VK)
31433121
: CastExpr(ImplicitCastExprClass, ty, VK, kind, op, BasePathLength) { }
@@ -3245,8 +3223,7 @@ class ExplicitCastExpr : public CastExpr {
32453223
/// (Type)expr. For example: @c (int)f.
32463224
class CStyleCastExpr final
32473225
: public ExplicitCastExpr,
3248-
private llvm::TrailingObjects<CStyleCastExpr, CastExpr::BasePathSizeTy,
3249-
CXXBaseSpecifier *> {
3226+
private llvm::TrailingObjects<CStyleCastExpr, CXXBaseSpecifier *> {
32503227
SourceLocation LPLoc; // the location of the left paren
32513228
SourceLocation RPLoc; // the location of the right paren
32523229

@@ -3260,10 +3237,6 @@ class CStyleCastExpr final
32603237
explicit CStyleCastExpr(EmptyShell Shell, unsigned PathSize)
32613238
: ExplicitCastExpr(CStyleCastExprClass, Shell, PathSize) { }
32623239

3263-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
3264-
return path_empty() ? 0 : 1;
3265-
}
3266-
32673240
public:
32683241
static CStyleCastExpr *Create(const ASTContext &Context, QualType T,
32693242
ExprValueKind VK, CastKind K,

‎clang/include/clang/AST/ExprCXX.h

+4-29
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,7 @@ class CXXNamedCastExpr : public ExplicitCastExpr {
325325
/// \c static_cast<int>(1.0).
326326
class CXXStaticCastExpr final
327327
: public CXXNamedCastExpr,
328-
private llvm::TrailingObjects<CXXStaticCastExpr, CastExpr::BasePathSizeTy,
329-
CXXBaseSpecifier *> {
328+
private llvm::TrailingObjects<CXXStaticCastExpr, CXXBaseSpecifier *> {
330329
CXXStaticCastExpr(QualType ty, ExprValueKind vk, CastKind kind, Expr *op,
331330
unsigned pathSize, TypeSourceInfo *writtenTy,
332331
SourceLocation l, SourceLocation RParenLoc,
@@ -337,10 +336,6 @@ class CXXStaticCastExpr final
337336
explicit CXXStaticCastExpr(EmptyShell Empty, unsigned PathSize)
338337
: CXXNamedCastExpr(CXXStaticCastExprClass, Empty, PathSize) {}
339338

340-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
341-
return path_empty() ? 0 : 1;
342-
}
343-
344339
public:
345340
friend class CastExpr;
346341
friend TrailingObjects;
@@ -366,8 +361,7 @@ class CXXStaticCastExpr final
366361
/// check to determine how to perform the type conversion.
367362
class CXXDynamicCastExpr final
368363
: public CXXNamedCastExpr,
369-
private llvm::TrailingObjects<
370-
CXXDynamicCastExpr, CastExpr::BasePathSizeTy, CXXBaseSpecifier *> {
364+
private llvm::TrailingObjects<CXXDynamicCastExpr, CXXBaseSpecifier *> {
371365
CXXDynamicCastExpr(QualType ty, ExprValueKind VK, CastKind kind,
372366
Expr *op, unsigned pathSize, TypeSourceInfo *writtenTy,
373367
SourceLocation l, SourceLocation RParenLoc,
@@ -378,10 +372,6 @@ class CXXDynamicCastExpr final
378372
explicit CXXDynamicCastExpr(EmptyShell Empty, unsigned pathSize)
379373
: CXXNamedCastExpr(CXXDynamicCastExprClass, Empty, pathSize) {}
380374

381-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
382-
return path_empty() ? 0 : 1;
383-
}
384-
385375
public:
386376
friend class CastExpr;
387377
friend TrailingObjects;
@@ -414,7 +404,6 @@ class CXXDynamicCastExpr final
414404
class CXXReinterpretCastExpr final
415405
: public CXXNamedCastExpr,
416406
private llvm::TrailingObjects<CXXReinterpretCastExpr,
417-
CastExpr::BasePathSizeTy,
418407
CXXBaseSpecifier *> {
419408
CXXReinterpretCastExpr(QualType ty, ExprValueKind vk, CastKind kind,
420409
Expr *op, unsigned pathSize,
@@ -427,10 +416,6 @@ class CXXReinterpretCastExpr final
427416
CXXReinterpretCastExpr(EmptyShell Empty, unsigned pathSize)
428417
: CXXNamedCastExpr(CXXReinterpretCastExprClass, Empty, pathSize) {}
429418

430-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
431-
return path_empty() ? 0 : 1;
432-
}
433-
434419
public:
435420
friend class CastExpr;
436421
friend TrailingObjects;
@@ -458,8 +443,7 @@ class CXXReinterpretCastExpr final
458443
/// value.
459444
class CXXConstCastExpr final
460445
: public CXXNamedCastExpr,
461-
private llvm::TrailingObjects<CXXConstCastExpr, CastExpr::BasePathSizeTy,
462-
CXXBaseSpecifier *> {
446+
private llvm::TrailingObjects<CXXConstCastExpr, CXXBaseSpecifier *> {
463447
CXXConstCastExpr(QualType ty, ExprValueKind VK, Expr *op,
464448
TypeSourceInfo *writtenTy, SourceLocation l,
465449
SourceLocation RParenLoc, SourceRange AngleBrackets)
@@ -469,10 +453,6 @@ class CXXConstCastExpr final
469453
explicit CXXConstCastExpr(EmptyShell Empty)
470454
: CXXNamedCastExpr(CXXConstCastExprClass, Empty, 0) {}
471455

472-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
473-
return path_empty() ? 0 : 1;
474-
}
475-
476456
public:
477457
friend class CastExpr;
478458
friend TrailingObjects;
@@ -1538,8 +1518,7 @@ class CXXInheritedCtorInitExpr : public Expr {
15381518
/// \endcode
15391519
class CXXFunctionalCastExpr final
15401520
: public ExplicitCastExpr,
1541-
private llvm::TrailingObjects<
1542-
CXXFunctionalCastExpr, CastExpr::BasePathSizeTy, CXXBaseSpecifier *> {
1521+
private llvm::TrailingObjects<CXXFunctionalCastExpr, CXXBaseSpecifier *> {
15431522
SourceLocation LParenLoc;
15441523
SourceLocation RParenLoc;
15451524

@@ -1554,10 +1533,6 @@ class CXXFunctionalCastExpr final
15541533
explicit CXXFunctionalCastExpr(EmptyShell Shell, unsigned PathSize)
15551534
: ExplicitCastExpr(CXXFunctionalCastExprClass, Shell, PathSize) {}
15561535

1557-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
1558-
return path_empty() ? 0 : 1;
1559-
}
1560-
15611536
public:
15621537
friend class CastExpr;
15631538
friend TrailingObjects;

‎clang/include/clang/AST/ExprObjC.h

+1-6
Original file line numberDiff line numberDiff line change
@@ -1574,8 +1574,7 @@ class ObjCIndirectCopyRestoreExpr : public Expr {
15741574
/// \endcode
15751575
class ObjCBridgedCastExpr final
15761576
: public ExplicitCastExpr,
1577-
private llvm::TrailingObjects<
1578-
ObjCBridgedCastExpr, CastExpr::BasePathSizeTy, CXXBaseSpecifier *> {
1577+
private llvm::TrailingObjects<ObjCBridgedCastExpr, CXXBaseSpecifier *> {
15791578
friend class ASTStmtReader;
15801579
friend class ASTStmtWriter;
15811580
friend class CastExpr;
@@ -1585,10 +1584,6 @@ class ObjCBridgedCastExpr final
15851584
SourceLocation BridgeKeywordLoc;
15861585
unsigned Kind : 2;
15871586

1588-
size_t numTrailingObjects(OverloadToken<CastExpr::BasePathSizeTy>) const {
1589-
return path_empty() ? 0 : 1;
1590-
}
1591-
15921587
public:
15931588
ObjCBridgedCastExpr(SourceLocation LParenLoc, ObjCBridgeCastKind Kind,
15941589
CastKind CK, SourceLocation BridgeKeywordLoc,

‎clang/include/clang/AST/Stmt.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,10 @@ class alignas(void *) Stmt {
481481

482482
unsigned Kind : 6;
483483
unsigned PartOfExplicitCast : 1; // Only set for ImplicitCastExpr.
484-
unsigned BasePathIsEmpty : 1;
484+
485+
/// The number of CXXBaseSpecifiers in the cast. 14 bits would be enough
486+
/// here. ([implimits] Direct and indirect base classes [16384]).
487+
unsigned BasePathSize;
485488
};
486489

487490
class BinaryOperatorBitfields {

‎clang/lib/AST/Expr.cpp

+4-27
Original file line numberDiff line numberDiff line change
@@ -1808,21 +1808,6 @@ NamedDecl *CastExpr::getConversionFunction() const {
18081808
return nullptr;
18091809
}
18101810

1811-
CastExpr::BasePathSizeTy *CastExpr::BasePathSize() {
1812-
assert(!path_empty());
1813-
switch (getStmtClass()) {
1814-
#define ABSTRACT_STMT(x)
1815-
#define CASTEXPR(Type, Base) \
1816-
case Stmt::Type##Class: \
1817-
return static_cast<Type *>(this) \
1818-
->getTrailingObjects<CastExpr::BasePathSizeTy>();
1819-
#define STMT(Type, Base)
1820-
#include "clang/AST/StmtNodes.inc"
1821-
default:
1822-
llvm_unreachable("non-cast expressions not possible here");
1823-
}
1824-
}
1825-
18261811
CXXBaseSpecifier **CastExpr::path_buffer() {
18271812
switch (getStmtClass()) {
18281813
#define ABSTRACT_STMT(x)
@@ -1861,9 +1846,7 @@ ImplicitCastExpr *ImplicitCastExpr::Create(const ASTContext &C, QualType T,
18611846
const CXXCastPath *BasePath,
18621847
ExprValueKind VK) {
18631848
unsigned PathSize = (BasePath ? BasePath->size() : 0);
1864-
void *Buffer =
1865-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
1866-
PathSize ? 1 : 0, PathSize));
1849+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
18671850
ImplicitCastExpr *E =
18681851
new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK);
18691852
if (PathSize)
@@ -1874,9 +1857,7 @@ ImplicitCastExpr *ImplicitCastExpr::Create(const ASTContext &C, QualType T,
18741857

18751858
ImplicitCastExpr *ImplicitCastExpr::CreateEmpty(const ASTContext &C,
18761859
unsigned PathSize) {
1877-
void *Buffer =
1878-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
1879-
PathSize ? 1 : 0, PathSize));
1860+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
18801861
return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize);
18811862
}
18821863

@@ -1887,9 +1868,7 @@ CStyleCastExpr *CStyleCastExpr::Create(const ASTContext &C, QualType T,
18871868
TypeSourceInfo *WrittenTy,
18881869
SourceLocation L, SourceLocation R) {
18891870
unsigned PathSize = (BasePath ? BasePath->size() : 0);
1890-
void *Buffer =
1891-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
1892-
PathSize ? 1 : 0, PathSize));
1871+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
18931872
CStyleCastExpr *E =
18941873
new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R);
18951874
if (PathSize)
@@ -1900,9 +1879,7 @@ CStyleCastExpr *CStyleCastExpr::Create(const ASTContext &C, QualType T,
19001879

19011880
CStyleCastExpr *CStyleCastExpr::CreateEmpty(const ASTContext &C,
19021881
unsigned PathSize) {
1903-
void *Buffer =
1904-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
1905-
PathSize ? 1 : 0, PathSize));
1882+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
19061883
return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize);
19071884
}
19081885

‎clang/lib/AST/ExprCXX.cpp

+8-24
Original file line numberDiff line numberDiff line change
@@ -694,9 +694,7 @@ CXXStaticCastExpr *CXXStaticCastExpr::Create(const ASTContext &C, QualType T,
694694
SourceLocation RParenLoc,
695695
SourceRange AngleBrackets) {
696696
unsigned PathSize = (BasePath ? BasePath->size() : 0);
697-
void *Buffer =
698-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
699-
PathSize ? 1 : 0, PathSize));
697+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
700698
auto *E =
701699
new (Buffer) CXXStaticCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
702700
RParenLoc, AngleBrackets);
@@ -708,9 +706,7 @@ CXXStaticCastExpr *CXXStaticCastExpr::Create(const ASTContext &C, QualType T,
708706

709707
CXXStaticCastExpr *CXXStaticCastExpr::CreateEmpty(const ASTContext &C,
710708
unsigned PathSize) {
711-
void *Buffer =
712-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
713-
PathSize ? 1 : 0, PathSize));
709+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
714710
return new (Buffer) CXXStaticCastExpr(EmptyShell(), PathSize);
715711
}
716712

@@ -723,9 +719,7 @@ CXXDynamicCastExpr *CXXDynamicCastExpr::Create(const ASTContext &C, QualType T,
723719
SourceLocation RParenLoc,
724720
SourceRange AngleBrackets) {
725721
unsigned PathSize = (BasePath ? BasePath->size() : 0);
726-
void *Buffer =
727-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
728-
PathSize ? 1 : 0, PathSize));
722+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
729723
auto *E =
730724
new (Buffer) CXXDynamicCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
731725
RParenLoc, AngleBrackets);
@@ -737,9 +731,7 @@ CXXDynamicCastExpr *CXXDynamicCastExpr::Create(const ASTContext &C, QualType T,
737731

738732
CXXDynamicCastExpr *CXXDynamicCastExpr::CreateEmpty(const ASTContext &C,
739733
unsigned PathSize) {
740-
void *Buffer =
741-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
742-
PathSize ? 1 : 0, PathSize));
734+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
743735
return new (Buffer) CXXDynamicCastExpr(EmptyShell(), PathSize);
744736
}
745737

@@ -784,9 +776,7 @@ CXXReinterpretCastExpr::Create(const ASTContext &C, QualType T,
784776
SourceLocation RParenLoc,
785777
SourceRange AngleBrackets) {
786778
unsigned PathSize = (BasePath ? BasePath->size() : 0);
787-
void *Buffer =
788-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
789-
PathSize ? 1 : 0, PathSize));
779+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
790780
auto *E =
791781
new (Buffer) CXXReinterpretCastExpr(T, VK, K, Op, PathSize, WrittenTy, L,
792782
RParenLoc, AngleBrackets);
@@ -798,9 +788,7 @@ CXXReinterpretCastExpr::Create(const ASTContext &C, QualType T,
798788

799789
CXXReinterpretCastExpr *
800790
CXXReinterpretCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
801-
void *Buffer =
802-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
803-
PathSize ? 1 : 0, PathSize));
791+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
804792
return new (Buffer) CXXReinterpretCastExpr(EmptyShell(), PathSize);
805793
}
806794

@@ -823,9 +811,7 @@ CXXFunctionalCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
823811
const CXXCastPath *BasePath,
824812
SourceLocation L, SourceLocation R) {
825813
unsigned PathSize = (BasePath ? BasePath->size() : 0);
826-
void *Buffer =
827-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
828-
PathSize ? 1 : 0, PathSize));
814+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
829815
auto *E =
830816
new (Buffer) CXXFunctionalCastExpr(T, VK, Written, K, Op, PathSize, L, R);
831817
if (PathSize)
@@ -836,9 +822,7 @@ CXXFunctionalCastExpr::Create(const ASTContext &C, QualType T, ExprValueKind VK,
836822

837823
CXXFunctionalCastExpr *
838824
CXXFunctionalCastExpr::CreateEmpty(const ASTContext &C, unsigned PathSize) {
839-
void *Buffer =
840-
C.Allocate(totalSizeToAlloc<CastExpr::BasePathSizeTy, CXXBaseSpecifier *>(
841-
PathSize ? 1 : 0, PathSize));
825+
void *Buffer = C.Allocate(totalSizeToAlloc<CXXBaseSpecifier *>(PathSize));
842826
return new (Buffer) CXXFunctionalCastExpr(EmptyShell(), PathSize);
843827
}
844828

0 commit comments

Comments
 (0)
Please sign in to comment.