Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 16 additions & 12 deletions clang/include/clang/AST/Expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -4579,7 +4579,6 @@ class ShuffleVectorExpr : public Expr {
// indices. The number of values in this list is always
// 2+the number of indices in the vector type.
Stmt **SubExprs;
unsigned NumExprs;

public:
ShuffleVectorExpr(const ASTContext &C, ArrayRef<Expr*> args, QualType Type,
Expand All @@ -4605,36 +4604,41 @@ class ShuffleVectorExpr : public Expr {
/// getNumSubExprs - Return the size of the SubExprs array. This includes the
/// constant expression, the actual arguments passed in, and the function
/// pointers.
unsigned getNumSubExprs() const { return NumExprs; }
unsigned getNumSubExprs() const { return ShuffleVectorExprBits.NumExprs; }

/// Retrieve the array of expressions.
Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }

/// getExpr - Return the Expr at the specified index.
Expr *getExpr(unsigned Index) {
assert((Index < NumExprs) && "Arg access out of range!");
assert((Index < ShuffleVectorExprBits.NumExprs) &&
"Arg access out of range!");
return cast<Expr>(SubExprs[Index]);
}
const Expr *getExpr(unsigned Index) const {
assert((Index < NumExprs) && "Arg access out of range!");
assert((Index < ShuffleVectorExprBits.NumExprs) &&
"Arg access out of range!");
return cast<Expr>(SubExprs[Index]);
}

void setExprs(const ASTContext &C, ArrayRef<Expr *> Exprs);

llvm::APSInt getShuffleMaskIdx(unsigned N) const {
assert((N < NumExprs - 2) && "Shuffle idx out of range!");
assert((N < ShuffleVectorExprBits.NumExprs - 2) &&
"Shuffle idx out of range!");
assert(isa<ConstantExpr>(getExpr(N + 2)) &&
"Index expression must be a ConstantExpr");
return cast<ConstantExpr>(getExpr(N + 2))->getAPValueResult().getInt();
}

// Iterators
child_range children() {
return child_range(&SubExprs[0], &SubExprs[0]+NumExprs);
return child_range(&SubExprs[0],
&SubExprs[0] + ShuffleVectorExprBits.NumExprs);
}
const_child_range children() const {
return const_child_range(&SubExprs[0], &SubExprs[0] + NumExprs);
return const_child_range(&SubExprs[0],
&SubExprs[0] + ShuffleVectorExprBits.NumExprs);
}
};

Expand Down Expand Up @@ -4776,13 +4780,13 @@ class ChooseExpr : public Expr {
enum { COND, LHS, RHS, END_EXPR };
Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
SourceLocation BuiltinLoc, RParenLoc;
bool CondIsTrue;

public:
ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t,
ExprValueKind VK, ExprObjectKind OK, SourceLocation RP,
bool condIsTrue)
: Expr(ChooseExprClass, t, VK, OK), BuiltinLoc(BLoc), RParenLoc(RP),
CondIsTrue(condIsTrue) {
: Expr(ChooseExprClass, t, VK, OK), BuiltinLoc(BLoc), RParenLoc(RP) {
ChooseExprBits.CondIsTrue = condIsTrue;
SubExprs[COND] = cond;
SubExprs[LHS] = lhs;
SubExprs[RHS] = rhs;
Expand All @@ -4798,9 +4802,9 @@ class ChooseExpr : public Expr {
bool isConditionTrue() const {
assert(!isConditionDependent() &&
"Dependent condition isn't true or false");
return CondIsTrue;
return ChooseExprBits.CondIsTrue;
}
void setIsConditionTrue(bool isTrue) { CondIsTrue = isTrue; }
void setIsConditionTrue(bool isTrue) { ChooseExprBits.CondIsTrue = isTrue; }

bool isConditionDependent() const {
return getCond()->isTypeDependent() || getCond()->isValueDependent();
Expand Down
74 changes: 36 additions & 38 deletions clang/include/clang/AST/ExprCXX.h
Original file line number Diff line number Diff line change
Expand Up @@ -2974,10 +2974,6 @@ class TypeTraitExpr final
/// __array_extent(int[10][20], 1) == 20
/// \endcode
class ArrayTypeTraitExpr : public Expr {
/// The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
LLVM_PREFERRED_TYPE(ArrayTypeTrait)
unsigned ATT : 2;

/// The value of the type trait. Unspecified if dependent.
uint64_t Value = 0;

Expand All @@ -2999,21 +2995,27 @@ class ArrayTypeTraitExpr : public Expr {
ArrayTypeTraitExpr(SourceLocation loc, ArrayTypeTrait att,
TypeSourceInfo *queried, uint64_t value, Expr *dimension,
SourceLocation rparen, QualType ty)
: Expr(ArrayTypeTraitExprClass, ty, VK_PRValue, OK_Ordinary), ATT(att),
: Expr(ArrayTypeTraitExprClass, ty, VK_PRValue, OK_Ordinary),
Value(value), Dimension(dimension), Loc(loc), RParen(rparen),
QueriedType(queried) {
assert(att <= ATT_Last && "invalid enum value!");
assert(static_cast<unsigned>(att) == ATT && "ATT overflow!");
ArrayTypeTraitExprBits.ATT = att;
assert(static_cast<unsigned>(att) == ArrayTypeTraitExprBits.ATT &&
"ATT overflow!");
setDependence(computeDependence(this));
}

explicit ArrayTypeTraitExpr(EmptyShell Empty)
: Expr(ArrayTypeTraitExprClass, Empty), ATT(0) {}
: Expr(ArrayTypeTraitExprClass, Empty) {
ArrayTypeTraitExprBits.ATT = 0;
}

SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
SourceLocation getEndLoc() const LLVM_READONLY { return RParen; }

ArrayTypeTrait getTrait() const { return static_cast<ArrayTypeTrait>(ATT); }
ArrayTypeTrait getTrait() const {
return static_cast<ArrayTypeTrait>(ArrayTypeTraitExprBits.ATT);
}

QualType getQueriedType() const { return QueriedType->getType(); }

Expand Down Expand Up @@ -3045,14 +3047,6 @@ class ArrayTypeTraitExpr : public Expr {
/// __is_lvalue_expr(1) == false
/// \endcode
class ExpressionTraitExpr : public Expr {
/// The trait. A ExpressionTrait enum in MSVC compatible unsigned.
LLVM_PREFERRED_TYPE(ExpressionTrait)
unsigned ET : 31;

/// The value of the type trait. Unspecified if dependent.
LLVM_PREFERRED_TYPE(bool)
unsigned Value : 1;

/// The location of the type trait keyword.
SourceLocation Loc;

Expand All @@ -3068,24 +3062,32 @@ class ExpressionTraitExpr : public Expr {
ExpressionTraitExpr(SourceLocation loc, ExpressionTrait et, Expr *queried,
bool value, SourceLocation rparen, QualType resultType)
: Expr(ExpressionTraitExprClass, resultType, VK_PRValue, OK_Ordinary),
ET(et), Value(value), Loc(loc), RParen(rparen),
QueriedExpression(queried) {
Loc(loc), RParen(rparen), QueriedExpression(queried) {
ExpressionTraitExprBits.ET = et;
ExpressionTraitExprBits.Value = value;

assert(et <= ET_Last && "invalid enum value!");
assert(static_cast<unsigned>(et) == ET && "ET overflow!");
assert(static_cast<unsigned>(et) == ExpressionTraitExprBits.ET &&
"ET overflow!");
setDependence(computeDependence(this));
}

explicit ExpressionTraitExpr(EmptyShell Empty)
: Expr(ExpressionTraitExprClass, Empty), ET(0), Value(false) {}
: Expr(ExpressionTraitExprClass, Empty) {
ExpressionTraitExprBits.ET = 0;
ExpressionTraitExprBits.Value = false;
}

SourceLocation getBeginLoc() const LLVM_READONLY { return Loc; }
SourceLocation getEndLoc() const LLVM_READONLY { return RParen; }

ExpressionTrait getTrait() const { return static_cast<ExpressionTrait>(ET); }
ExpressionTrait getTrait() const {
return static_cast<ExpressionTrait>(ExpressionTraitExprBits.ET);
}

Expr *getQueriedExpression() const { return QueriedExpression; }

bool getValue() const { return Value; }
bool getValue() const { return ExpressionTraitExprBits.Value; }

static bool classof(const Stmt *T) {
return T->getStmtClass() == ExpressionTraitExprClass;
Expand Down Expand Up @@ -4506,22 +4508,15 @@ class PackIndexingExpr final
// The pack being indexed, followed by the index
Stmt *SubExprs[2];

// The size of the trailing expressions.
unsigned TransformedExpressions : 31;

LLVM_PREFERRED_TYPE(bool)
unsigned FullySubstituted : 1;

PackIndexingExpr(QualType Type, SourceLocation EllipsisLoc,
SourceLocation RSquareLoc, Expr *PackIdExpr, Expr *IndexExpr,
ArrayRef<Expr *> SubstitutedExprs = {},
bool FullySubstituted = false)
: Expr(PackIndexingExprClass, Type, VK_LValue, OK_Ordinary),
EllipsisLoc(EllipsisLoc), RSquareLoc(RSquareLoc),
SubExprs{PackIdExpr, IndexExpr},
TransformedExpressions(SubstitutedExprs.size()),
FullySubstituted(FullySubstituted) {

SubExprs{PackIdExpr, IndexExpr} {
PackIndexingExprBits.TransformedExpressions = SubstitutedExprs.size();
PackIndexingExprBits.FullySubstituted = FullySubstituted;
auto *Exprs = getTrailingObjects<Expr *>();
llvm::uninitialized_copy(SubstitutedExprs, Exprs);

Expand All @@ -4534,7 +4529,7 @@ class PackIndexingExpr final
PackIndexingExpr(EmptyShell Empty) : Expr(PackIndexingExprClass, Empty) {}

unsigned numTrailingObjects(OverloadToken<Expr *>) const {
return TransformedExpressions;
return PackIndexingExprBits.TransformedExpressions;
}

public:
Expand All @@ -4548,11 +4543,14 @@ class PackIndexingExpr final
unsigned NumTransformedExprs);

// The index expression and all elements of the pack have been substituted.
bool isFullySubstituted() const { return FullySubstituted; }
bool isFullySubstituted() const {
return PackIndexingExprBits.FullySubstituted;
}

/// Determine if the expression was expanded to empty.
bool expandsToEmptyPack() const {
return isFullySubstituted() && TransformedExpressions == 0;
return isFullySubstituted() &&
PackIndexingExprBits.TransformedExpressions == 0;
}

/// Determine the location of the 'sizeof' keyword.
Expand Down Expand Up @@ -4590,7 +4588,8 @@ class PackIndexingExpr final

/// Return the trailing expressions, regardless of the expansion.
ArrayRef<Expr *> getExpressions() const {
return {getTrailingObjects<Expr *>(), TransformedExpressions};
return {getTrailingObjects<Expr *>(),
PackIndexingExprBits.TransformedExpressions};
}

static bool classof(const Stmt *T) {
Expand Down Expand Up @@ -4988,7 +4987,6 @@ class CXXFoldExpr : public Expr {
// than the number of expansions.
UnsignedOrNone NumExpansions = std::nullopt;
Stmt *SubExprs[SubExpr::Count];
BinaryOperatorKind Opcode;

public:
CXXFoldExpr(QualType T, UnresolvedLookupExpr *Callee,
Expand Down Expand Up @@ -5021,7 +5019,7 @@ class CXXFoldExpr : public Expr {
SourceLocation getLParenLoc() const { return LParenLoc; }
SourceLocation getRParenLoc() const { return RParenLoc; }
SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
BinaryOperatorKind getOperator() const { return Opcode; }
BinaryOperatorKind getOperator() const { return CXXFoldExprBits.Opcode; }

UnsignedOrNone getNumExpansions() const { return NumExpansions; }

Expand Down
78 changes: 78 additions & 0 deletions clang/include/clang/AST/Stmt.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "clang/AST/OperationKinds.h"
#include "clang/AST/StmtIterator.h"
#include "clang/Basic/CapturedStmt.h"
#include "clang/Basic/ExpressionTraits.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/Lambda.h"
Expand Down Expand Up @@ -736,6 +737,15 @@ class alignas(void *) Stmt {
unsigned ProducedByFoldExpansion : 1;
};

class ShuffleVectorExprBitfields {
friend class ShuffleVectorExpr;

LLVM_PREFERRED_TYPE(ExprBitfields)
unsigned : NumExprBits;

unsigned NumExprs;
};

class StmtExprBitfields {
friend class ASTStmtReader;
friend class StmtExpr;
Expand All @@ -749,6 +759,17 @@ class alignas(void *) Stmt {
unsigned TemplateDepth;
};

class ChooseExprBitfields {
friend class ASTStmtReader;
friend class ChooseExpr;

LLVM_PREFERRED_TYPE(ExprBitfields)
unsigned : NumExprBits;

LLVM_PREFERRED_TYPE(bool)
bool CondIsTrue : 1;
};

//===--- C++ Expression bitfields classes ---===//

class CXXOperatorCallExprBitfields {
Expand Down Expand Up @@ -1184,6 +1205,57 @@ class alignas(void *) Stmt {
SourceLocation RequiresKWLoc;
};

class ArrayTypeTraitExprBitfields {
friend class ArrayTypeTraitExpr;
friend class ASTStmtReader;
LLVM_PREFERRED_TYPE(ExprBitfields)
unsigned : NumExprBits;

/// The trait. An ArrayTypeTrait enum in MSVC compat unsigned.
LLVM_PREFERRED_TYPE(ArrayTypeTrait)
unsigned ATT : 2;
};

class ExpressionTraitExprBitfields {
friend class ExpressionTraitExpr;
friend class ASTStmtReader;
LLVM_PREFERRED_TYPE(ExprBitfields)
unsigned : NumExprBits;

/// The trait. A ExpressionTrait enum in MSVC compatible unsigned.
LLVM_PREFERRED_TYPE(ExpressionTrait)
unsigned ET : 31;

/// The value of the type trait. Unspecified if dependent.
LLVM_PREFERRED_TYPE(bool)
unsigned Value : 1;
};

class CXXFoldExprBitfields {
friend class CXXFoldExpr;
friend class ASTStmtReader;
friend class ASTStmtWriter;

LLVM_PREFERRED_TYPE(ExprBitfields)
unsigned : NumExprBits;

BinaryOperatorKind Opcode;
};

class PackIndexingExprBitfields {
friend class PackIndexingExpr;
friend class ASTStmtWriter;
friend class ASTStmtReader;

LLVM_PREFERRED_TYPE(ExprBitfields)
unsigned : NumExprBits;
// The size of the trailing expressions.
unsigned TransformedExpressions : 31;

LLVM_PREFERRED_TYPE(bool)
unsigned FullySubstituted : 1;
};

//===--- C++ Coroutines bitfields classes ---===//

class CoawaitExprBitfields {
Expand Down Expand Up @@ -1279,9 +1351,11 @@ class alignas(void *) Stmt {
PseudoObjectExprBitfields PseudoObjectExprBits;
SourceLocExprBitfields SourceLocExprBits;
ParenExprBitfields ParenExprBits;
ShuffleVectorExprBitfields ShuffleVectorExprBits;

// GNU Extensions.
StmtExprBitfields StmtExprBits;
ChooseExprBitfields ChooseExprBits;

// C++ Expressions
CXXOperatorCallExprBitfields CXXOperatorCallExprBits;
Expand All @@ -1308,6 +1382,10 @@ class alignas(void *) Stmt {
SubstNonTypeTemplateParmExprBitfields SubstNonTypeTemplateParmExprBits;
LambdaExprBitfields LambdaExprBits;
RequiresExprBitfields RequiresExprBits;
ArrayTypeTraitExprBitfields ArrayTypeTraitExprBits;
ExpressionTraitExprBitfields ExpressionTraitExprBits;
CXXFoldExprBitfields CXXFoldExprBits;
PackIndexingExprBitfields PackIndexingExprBits;

// C++ Coroutines expressions
CoawaitExprBitfields CoawaitBits;
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/AST/StmtCXX.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,11 +133,11 @@ class CXXTryStmt final : public Stmt,
/// analysis of the constituent components. The original syntactic components
/// can be extracted using getLoopVariable and getRangeInit.
class CXXForRangeStmt : public Stmt {
SourceLocation ForLoc;
enum { INIT, RANGE, BEGINSTMT, ENDSTMT, COND, INC, LOOPVAR, BODY, END };
// SubExprs[RANGE] is an expression or declstmt.
// SubExprs[COND] and SubExprs[INC] are expressions.
Stmt *SubExprs[END];
SourceLocation ForLoc;
SourceLocation CoawaitLoc;
SourceLocation ColonLoc;
SourceLocation RParenLoc;
Expand Down
Loading