forked from OSchip/llvm-project
[AST][NFC] Pack DependentScopeDeclRefExpr and CXXUnresolvedConstructExpr
Use the newly available space in the bit-fields of Stmt. This saves 1 pointer per DependentScopeDeclRefExpr/CXXUnresolvedConstructExpr. Additionally rename "TypeSourceInfo *Type;" to "TypeSourceInfo *TSI;" as was done in D56022 (r350003) (but this is an internal detail anyway), and clang-format both classes. NFC. llvm-svn: 350525
This commit is contained in:
parent
26e6c86b79
commit
49ee964e19
|
@ -2936,6 +2936,10 @@ class DependentScopeDeclRefExpr final
|
|||
private llvm::TrailingObjects<DependentScopeDeclRefExpr,
|
||||
ASTTemplateKWAndArgsInfo,
|
||||
TemplateArgumentLoc> {
|
||||
friend class ASTStmtReader;
|
||||
friend class ASTStmtWriter;
|
||||
friend TrailingObjects;
|
||||
|
||||
/// The nested-name-specifier that qualifies this unresolved
|
||||
/// declaration name.
|
||||
NestedNameSpecifierLoc QualifierLoc;
|
||||
|
@ -2943,32 +2947,26 @@ class DependentScopeDeclRefExpr final
|
|||
/// The name of the entity we will be referencing.
|
||||
DeclarationNameInfo NameInfo;
|
||||
|
||||
/// Whether the name includes info for explicit template
|
||||
/// keyword and arguments.
|
||||
bool HasTemplateKWAndArgsInfo;
|
||||
|
||||
DependentScopeDeclRefExpr(QualType T,
|
||||
NestedNameSpecifierLoc QualifierLoc,
|
||||
DependentScopeDeclRefExpr(QualType Ty, NestedNameSpecifierLoc QualifierLoc,
|
||||
SourceLocation TemplateKWLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
const TemplateArgumentListInfo *Args);
|
||||
|
||||
size_t numTrailingObjects(OverloadToken<ASTTemplateKWAndArgsInfo>) const {
|
||||
return HasTemplateKWAndArgsInfo ? 1 : 0;
|
||||
return hasTemplateKWAndArgsInfo();
|
||||
}
|
||||
|
||||
bool hasTemplateKWAndArgsInfo() const {
|
||||
return DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo;
|
||||
}
|
||||
|
||||
public:
|
||||
friend class ASTStmtReader;
|
||||
friend class ASTStmtWriter;
|
||||
friend TrailingObjects;
|
||||
|
||||
static DependentScopeDeclRefExpr *Create(const ASTContext &C,
|
||||
NestedNameSpecifierLoc QualifierLoc,
|
||||
SourceLocation TemplateKWLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
static DependentScopeDeclRefExpr *
|
||||
Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
|
||||
SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
|
||||
const TemplateArgumentListInfo *TemplateArgs);
|
||||
|
||||
static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &C,
|
||||
static DependentScopeDeclRefExpr *CreateEmpty(const ASTContext &Context,
|
||||
bool HasTemplateKWAndArgsInfo,
|
||||
unsigned NumTemplateArgs);
|
||||
|
||||
|
@ -2996,21 +2994,24 @@ public:
|
|||
/// Retrieve the location of the template keyword preceding
|
||||
/// this name, if any.
|
||||
SourceLocation getTemplateKeywordLoc() const {
|
||||
if (!HasTemplateKWAndArgsInfo) return SourceLocation();
|
||||
if (!hasTemplateKWAndArgsInfo())
|
||||
return SourceLocation();
|
||||
return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->TemplateKWLoc;
|
||||
}
|
||||
|
||||
/// Retrieve the location of the left angle bracket starting the
|
||||
/// explicit template argument list following the name, if any.
|
||||
SourceLocation getLAngleLoc() const {
|
||||
if (!HasTemplateKWAndArgsInfo) return SourceLocation();
|
||||
if (!hasTemplateKWAndArgsInfo())
|
||||
return SourceLocation();
|
||||
return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->LAngleLoc;
|
||||
}
|
||||
|
||||
/// Retrieve the location of the right angle bracket ending the
|
||||
/// explicit template argument list following the name, if any.
|
||||
SourceLocation getRAngleLoc() const {
|
||||
if (!HasTemplateKWAndArgsInfo) return SourceLocation();
|
||||
if (!hasTemplateKWAndArgsInfo())
|
||||
return SourceLocation();
|
||||
return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->RAngleLoc;
|
||||
}
|
||||
|
||||
|
@ -3164,7 +3165,7 @@ class CXXUnresolvedConstructExpr final
|
|||
friend TrailingObjects;
|
||||
|
||||
/// The type being constructed.
|
||||
TypeSourceInfo *Type = nullptr;
|
||||
TypeSourceInfo *TSI;
|
||||
|
||||
/// The location of the left parentheses ('(').
|
||||
SourceLocation LParenLoc;
|
||||
|
@ -3172,34 +3173,31 @@ class CXXUnresolvedConstructExpr final
|
|||
/// The location of the right parentheses (')').
|
||||
SourceLocation RParenLoc;
|
||||
|
||||
/// The number of arguments used to construct the type.
|
||||
unsigned NumArgs;
|
||||
|
||||
CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
|
||||
SourceLocation LParenLoc,
|
||||
ArrayRef<Expr*> Args,
|
||||
SourceLocation RParenLoc);
|
||||
CXXUnresolvedConstructExpr(TypeSourceInfo *TSI, SourceLocation LParenLoc,
|
||||
ArrayRef<Expr *> Args, SourceLocation RParenLoc);
|
||||
|
||||
CXXUnresolvedConstructExpr(EmptyShell Empty, unsigned NumArgs)
|
||||
: Expr(CXXUnresolvedConstructExprClass, Empty), NumArgs(NumArgs) {}
|
||||
: Expr(CXXUnresolvedConstructExprClass, Empty) {
|
||||
CXXUnresolvedConstructExprBits.NumArgs = NumArgs;
|
||||
}
|
||||
|
||||
public:
|
||||
static CXXUnresolvedConstructExpr *Create(const ASTContext &C,
|
||||
static CXXUnresolvedConstructExpr *Create(const ASTContext &Context,
|
||||
TypeSourceInfo *Type,
|
||||
SourceLocation LParenLoc,
|
||||
ArrayRef<Expr*> Args,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RParenLoc);
|
||||
|
||||
static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &C,
|
||||
static CXXUnresolvedConstructExpr *CreateEmpty(const ASTContext &Context,
|
||||
unsigned NumArgs);
|
||||
|
||||
/// Retrieve the type that is being constructed, as specified
|
||||
/// in the source code.
|
||||
QualType getTypeAsWritten() const { return Type->getType(); }
|
||||
QualType getTypeAsWritten() const { return TSI->getType(); }
|
||||
|
||||
/// Retrieve the type source information for the type being
|
||||
/// constructed.
|
||||
TypeSourceInfo *getTypeSourceInfo() const { return Type; }
|
||||
TypeSourceInfo *getTypeSourceInfo() const { return TSI; }
|
||||
|
||||
/// Retrieve the location of the left parentheses ('(') that
|
||||
/// precedes the argument list.
|
||||
|
@ -3217,46 +3215,43 @@ public:
|
|||
bool isListInitialization() const { return LParenLoc.isInvalid(); }
|
||||
|
||||
/// Retrieve the number of arguments.
|
||||
unsigned arg_size() const { return NumArgs; }
|
||||
unsigned arg_size() const { return CXXUnresolvedConstructExprBits.NumArgs; }
|
||||
|
||||
using arg_iterator = Expr **;
|
||||
using arg_range = llvm::iterator_range<arg_iterator>;
|
||||
|
||||
arg_iterator arg_begin() { return getTrailingObjects<Expr *>(); }
|
||||
arg_iterator arg_end() { return arg_begin() + NumArgs; }
|
||||
arg_iterator arg_end() { return arg_begin() + arg_size(); }
|
||||
arg_range arguments() { return arg_range(arg_begin(), arg_end()); }
|
||||
|
||||
using const_arg_iterator = const Expr* const *;
|
||||
using const_arg_range = llvm::iterator_range<const_arg_iterator>;
|
||||
|
||||
const_arg_iterator arg_begin() const { return getTrailingObjects<Expr *>(); }
|
||||
const_arg_iterator arg_end() const {
|
||||
return arg_begin() + NumArgs;
|
||||
}
|
||||
const_arg_iterator arg_end() const { return arg_begin() + arg_size(); }
|
||||
const_arg_range arguments() const {
|
||||
return const_arg_range(arg_begin(), arg_end());
|
||||
}
|
||||
|
||||
Expr *getArg(unsigned I) {
|
||||
assert(I < NumArgs && "Argument index out-of-range");
|
||||
return *(arg_begin() + I);
|
||||
assert(I < arg_size() && "Argument index out-of-range");
|
||||
return arg_begin()[I];
|
||||
}
|
||||
|
||||
const Expr *getArg(unsigned I) const {
|
||||
assert(I < NumArgs && "Argument index out-of-range");
|
||||
return *(arg_begin() + I);
|
||||
assert(I < arg_size() && "Argument index out-of-range");
|
||||
return arg_begin()[I];
|
||||
}
|
||||
|
||||
void setArg(unsigned I, Expr *E) {
|
||||
assert(I < NumArgs && "Argument index out-of-range");
|
||||
*(arg_begin() + I) = E;
|
||||
assert(I < arg_size() && "Argument index out-of-range");
|
||||
arg_begin()[I] = E;
|
||||
}
|
||||
|
||||
SourceLocation getBeginLoc() const LLVM_READONLY;
|
||||
|
||||
SourceLocation getEndLoc() const LLVM_READONLY {
|
||||
if (!RParenLoc.isValid() && NumArgs > 0)
|
||||
return getArg(NumArgs - 1)->getEndLoc();
|
||||
if (!RParenLoc.isValid() && arg_size() > 0)
|
||||
return getArg(arg_size() - 1)->getEndLoc();
|
||||
return RParenLoc;
|
||||
}
|
||||
|
||||
|
@ -3267,7 +3262,7 @@ public:
|
|||
// Iterators
|
||||
child_range children() {
|
||||
auto **begin = reinterpret_cast<Stmt **>(arg_begin());
|
||||
return child_range(begin, begin + NumArgs);
|
||||
return child_range(begin, begin + arg_size());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -655,6 +655,18 @@ protected:
|
|||
unsigned NumArgs : 32 - 8 - 1 - NumExprBits;
|
||||
};
|
||||
|
||||
class DependentScopeDeclRefExprBitfields {
|
||||
friend class ASTStmtReader;
|
||||
friend class ASTStmtWriter;
|
||||
friend class DependentScopeDeclRefExpr;
|
||||
|
||||
unsigned : NumExprBits;
|
||||
|
||||
/// Whether the name includes info for explicit template
|
||||
/// keyword and arguments.
|
||||
unsigned HasTemplateKWAndArgsInfo : 1;
|
||||
};
|
||||
|
||||
class CXXConstructExprBitfields {
|
||||
friend class ASTStmtReader;
|
||||
friend class CXXConstructExpr;
|
||||
|
@ -683,6 +695,16 @@ protected:
|
|||
unsigned NumObjects : 32 - 1 - NumExprBits;
|
||||
};
|
||||
|
||||
class CXXUnresolvedConstructExprBitfields {
|
||||
friend class ASTStmtReader;
|
||||
friend class CXXUnresolvedConstructExpr;
|
||||
|
||||
unsigned : NumExprBits;
|
||||
|
||||
/// The number of arguments used to construct the type.
|
||||
unsigned NumArgs;
|
||||
};
|
||||
|
||||
//===--- C++ Coroutines TS bitfields classes ---===//
|
||||
|
||||
class CoawaitExprBitfields {
|
||||
|
@ -765,8 +787,10 @@ protected:
|
|||
CXXDefaultInitExprBitfields CXXDefaultInitExprBits;
|
||||
CXXDeleteExprBitfields CXXDeleteExprBits;
|
||||
TypeTraitExprBitfields TypeTraitExprBits;
|
||||
DependentScopeDeclRefExprBitfields DependentScopeDeclRefExprBits;
|
||||
CXXConstructExprBitfields CXXConstructExprBits;
|
||||
ExprWithCleanupsBitfields ExprWithCleanupsBits;
|
||||
CXXUnresolvedConstructExprBitfields CXXUnresolvedConstructExprBits;
|
||||
|
||||
// C++ Coroutines TS expressions
|
||||
CoawaitExprBitfields CoawaitBits;
|
||||
|
|
|
@ -385,23 +385,22 @@ CXXRecordDecl *OverloadExpr::getNamingClass() const {
|
|||
}
|
||||
|
||||
// DependentScopeDeclRefExpr
|
||||
DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
|
||||
NestedNameSpecifierLoc QualifierLoc,
|
||||
SourceLocation TemplateKWLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(
|
||||
QualType Ty, NestedNameSpecifierLoc QualifierLoc,
|
||||
SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
|
||||
const TemplateArgumentListInfo *Args)
|
||||
: Expr(DependentScopeDeclRefExprClass, T, VK_LValue, OK_Ordinary,
|
||||
true, true,
|
||||
: Expr(
|
||||
DependentScopeDeclRefExprClass, Ty, VK_LValue, OK_Ordinary, true,
|
||||
true,
|
||||
(NameInfo.isInstantiationDependent() ||
|
||||
(QualifierLoc &&
|
||||
QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())),
|
||||
(NameInfo.containsUnexpandedParameterPack() ||
|
||||
(QualifierLoc &&
|
||||
QualifierLoc.getNestedNameSpecifier()
|
||||
(QualifierLoc && QualifierLoc.getNestedNameSpecifier()
|
||||
->containsUnexpandedParameterPack()))),
|
||||
QualifierLoc(QualifierLoc), NameInfo(NameInfo),
|
||||
HasTemplateKWAndArgsInfo(Args != nullptr || TemplateKWLoc.isValid())
|
||||
{
|
||||
QualifierLoc(QualifierLoc), NameInfo(NameInfo) {
|
||||
DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
|
||||
(Args != nullptr) || TemplateKWLoc.isValid();
|
||||
if (Args) {
|
||||
bool Dependent = true;
|
||||
bool InstantiationDependent = true;
|
||||
|
@ -417,36 +416,34 @@ DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
|
|||
}
|
||||
}
|
||||
|
||||
DependentScopeDeclRefExpr *
|
||||
DependentScopeDeclRefExpr::Create(const ASTContext &C,
|
||||
NestedNameSpecifierLoc QualifierLoc,
|
||||
SourceLocation TemplateKWLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
DependentScopeDeclRefExpr *DependentScopeDeclRefExpr::Create(
|
||||
const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc,
|
||||
SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo,
|
||||
const TemplateArgumentListInfo *Args) {
|
||||
assert(QualifierLoc && "should be created for dependent qualifiers");
|
||||
bool HasTemplateKWAndArgsInfo = Args || TemplateKWLoc.isValid();
|
||||
std::size_t Size =
|
||||
totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
|
||||
HasTemplateKWAndArgsInfo, Args ? Args->size() : 0);
|
||||
void *Mem = C.Allocate(Size);
|
||||
return new (Mem) DependentScopeDeclRefExpr(C.DependentTy, QualifierLoc,
|
||||
void *Mem = Context.Allocate(Size);
|
||||
return new (Mem) DependentScopeDeclRefExpr(Context.DependentTy, QualifierLoc,
|
||||
TemplateKWLoc, NameInfo, Args);
|
||||
}
|
||||
|
||||
DependentScopeDeclRefExpr *
|
||||
DependentScopeDeclRefExpr::CreateEmpty(const ASTContext &C,
|
||||
DependentScopeDeclRefExpr::CreateEmpty(const ASTContext &Context,
|
||||
bool HasTemplateKWAndArgsInfo,
|
||||
unsigned NumTemplateArgs) {
|
||||
assert(NumTemplateArgs == 0 || HasTemplateKWAndArgsInfo);
|
||||
std::size_t Size =
|
||||
totalSizeToAlloc<ASTTemplateKWAndArgsInfo, TemplateArgumentLoc>(
|
||||
HasTemplateKWAndArgsInfo, NumTemplateArgs);
|
||||
void *Mem = C.Allocate(Size);
|
||||
auto *E =
|
||||
new (Mem) DependentScopeDeclRefExpr(QualType(), NestedNameSpecifierLoc(),
|
||||
SourceLocation(),
|
||||
void *Mem = Context.Allocate(Size);
|
||||
auto *E = new (Mem) DependentScopeDeclRefExpr(
|
||||
QualType(), NestedNameSpecifierLoc(), SourceLocation(),
|
||||
DeclarationNameInfo(), nullptr);
|
||||
E->HasTemplateKWAndArgsInfo = HasTemplateKWAndArgsInfo;
|
||||
E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo =
|
||||
HasTemplateKWAndArgsInfo;
|
||||
return E;
|
||||
}
|
||||
|
||||
|
@ -1216,22 +1213,22 @@ ExprWithCleanups *ExprWithCleanups::Create(const ASTContext &C,
|
|||
return new (buffer) ExprWithCleanups(empty, numObjects);
|
||||
}
|
||||
|
||||
CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
|
||||
CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *TSI,
|
||||
SourceLocation LParenLoc,
|
||||
ArrayRef<Expr*> Args,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceLocation RParenLoc)
|
||||
: Expr(CXXUnresolvedConstructExprClass,
|
||||
Type->getType().getNonReferenceType(),
|
||||
(Type->getType()->isLValueReferenceType()
|
||||
TSI->getType().getNonReferenceType(),
|
||||
(TSI->getType()->isLValueReferenceType()
|
||||
? VK_LValue
|
||||
: Type->getType()->isRValueReferenceType() ? VK_XValue
|
||||
: TSI->getType()->isRValueReferenceType() ? VK_XValue
|
||||
: VK_RValue),
|
||||
OK_Ordinary,
|
||||
Type->getType()->isDependentType() ||
|
||||
Type->getType()->getContainedDeducedType(),
|
||||
true, true, Type->getType()->containsUnexpandedParameterPack()),
|
||||
Type(Type), LParenLoc(LParenLoc), RParenLoc(RParenLoc),
|
||||
NumArgs(Args.size()) {
|
||||
TSI->getType()->isDependentType() ||
|
||||
TSI->getType()->getContainedDeducedType(),
|
||||
true, true, TSI->getType()->containsUnexpandedParameterPack()),
|
||||
TSI(TSI), LParenLoc(LParenLoc), RParenLoc(RParenLoc) {
|
||||
CXXUnresolvedConstructExprBits.NumArgs = Args.size();
|
||||
auto **StoredArgs = getTrailingObjects<Expr *>();
|
||||
for (unsigned I = 0; I != Args.size(); ++I) {
|
||||
if (Args[I]->containsUnexpandedParameterPack())
|
||||
|
@ -1241,25 +1238,22 @@ CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
|
|||
}
|
||||
}
|
||||
|
||||
CXXUnresolvedConstructExpr *
|
||||
CXXUnresolvedConstructExpr::Create(const ASTContext &C,
|
||||
TypeSourceInfo *Type,
|
||||
SourceLocation LParenLoc,
|
||||
ArrayRef<Expr*> Args,
|
||||
SourceLocation RParenLoc) {
|
||||
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(Args.size()));
|
||||
return new (Mem) CXXUnresolvedConstructExpr(Type, LParenLoc, Args, RParenLoc);
|
||||
CXXUnresolvedConstructExpr *CXXUnresolvedConstructExpr::Create(
|
||||
const ASTContext &Context, TypeSourceInfo *TSI, SourceLocation LParenLoc,
|
||||
ArrayRef<Expr *> Args, SourceLocation RParenLoc) {
|
||||
void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(Args.size()));
|
||||
return new (Mem) CXXUnresolvedConstructExpr(TSI, LParenLoc, Args, RParenLoc);
|
||||
}
|
||||
|
||||
CXXUnresolvedConstructExpr *
|
||||
CXXUnresolvedConstructExpr::CreateEmpty(const ASTContext &C, unsigned NumArgs) {
|
||||
Stmt::EmptyShell Empty;
|
||||
void *Mem = C.Allocate(totalSizeToAlloc<Expr *>(NumArgs));
|
||||
return new (Mem) CXXUnresolvedConstructExpr(Empty, NumArgs);
|
||||
CXXUnresolvedConstructExpr::CreateEmpty(const ASTContext &Context,
|
||||
unsigned NumArgs) {
|
||||
void *Mem = Context.Allocate(totalSizeToAlloc<Expr *>(NumArgs));
|
||||
return new (Mem) CXXUnresolvedConstructExpr(EmptyShell(), NumArgs);
|
||||
}
|
||||
|
||||
SourceLocation CXXUnresolvedConstructExpr::getBeginLoc() const {
|
||||
return Type->getTypeLoc().getBeginLoc();
|
||||
return TSI->getTypeLoc().getBeginLoc();
|
||||
}
|
||||
|
||||
CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(
|
||||
|
|
|
@ -1612,7 +1612,7 @@ ASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
|
|||
Record.skipInts(1);
|
||||
for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
|
||||
E->setArg(I, Record.readSubExpr());
|
||||
E->Type = GetTypeSourceInfo();
|
||||
E->TSI = GetTypeSourceInfo();
|
||||
E->setLParenLoc(ReadSourceLocation());
|
||||
E->setRParenLoc(ReadSourceLocation());
|
||||
}
|
||||
|
|
|
@ -1583,8 +1583,8 @@ ASTStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
|
|||
// Don't emit anything here, HasTemplateKWAndArgsInfo must be
|
||||
// emitted first.
|
||||
|
||||
Record.push_back(E->HasTemplateKWAndArgsInfo);
|
||||
if (E->HasTemplateKWAndArgsInfo) {
|
||||
Record.push_back(E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo);
|
||||
if (E->DependentScopeDeclRefExprBits.HasTemplateKWAndArgsInfo) {
|
||||
const ASTTemplateKWAndArgsInfo &ArgInfo =
|
||||
*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>();
|
||||
Record.push_back(ArgInfo.NumTemplateArgs);
|
||||
|
|
Loading…
Reference in New Issue