aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-04-24 16:57:13 +0000
committerAnders Carlsson <andersca@mac.com>2010-04-24 16:57:13 +0000
commitf1b48b7014992155286d58bb1676f9f51031d18b (patch)
tree8bbd12ee8c2c73a29c2c08c91dfc7d5448a959cb
parentc70e93c8b1e9dc566bb9a31951c21de7a166d4ac (diff)
CastExpr should not hold a pointer to the base path. More cleanup.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102249 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/Expr.h11
-rw-r--r--include/clang/AST/UsuallyTinyPtrVector.h2
-rw-r--r--lib/AST/ASTImporter.cpp5
-rw-r--r--lib/AST/Expr.cpp3
-rw-r--r--lib/CodeGen/CGObjC.cpp2
-rw-r--r--lib/Frontend/RewriteObjC.cpp2
-rw-r--r--lib/Sema/Sema.cpp5
-rw-r--r--lib/Sema/Sema.h5
-rw-r--r--lib/Sema/SemaDecl.cpp2
-rw-r--r--lib/Sema/SemaExpr.cpp3
-rw-r--r--lib/Sema/SemaExprCXX.cpp9
-rw-r--r--lib/Sema/SemaInit.cpp12
-rw-r--r--lib/Sema/SemaOverload.cpp9
-rw-r--r--lib/Sema/SemaTemplate.cpp2
14 files changed, 33 insertions, 39 deletions
diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h
index fc03bde93a..20981f74a4 100644
--- a/include/clang/AST/Expr.h
+++ b/include/clang/AST/Expr.h
@@ -1653,7 +1653,7 @@ private:
/// BasePath - For derived-to-base and base-to-derived casts, the base array
/// contains the inheritance path.
- CXXBaseSpecifierArray *BasePath;
+ CXXBaseSpecifierArray BasePath;
void CheckBasePath() const {
#ifndef NDEBUG
@@ -1687,7 +1687,7 @@ private:
case CK_MemberPointerToBoolean:
case CK_AnyPointerToObjCPointerCast:
case CK_AnyPointerToBlockPointerCast:
- assert(!BasePath && "Cast kind shoudl not have a base path!");
+ assert(BasePath.empty() && "Cast kind shoudl not have a base path!");
break;
}
#endif
@@ -1695,7 +1695,7 @@ private:
protected:
CastExpr(StmtClass SC, QualType ty, const CastKind kind, Expr *op,
- CXXBaseSpecifierArray *BasePath) :
+ CXXBaseSpecifierArray BasePath) :
Expr(SC, ty,
// Cast expressions are type-dependent if the type is
// dependent (C++ [temp.dep.expr]p3).
@@ -1769,7 +1769,7 @@ class ImplicitCastExpr : public CastExpr {
public:
ImplicitCastExpr(QualType ty, CastKind kind, Expr *op,
- CXXBaseSpecifierArray *BasePath, bool Lvalue)
+ CXXBaseSpecifierArray BasePath, bool Lvalue)
: CastExpr(ImplicitCastExprClass, ty, kind, op, BasePath),
LvalueCast(Lvalue) { }
@@ -1817,7 +1817,8 @@ class ExplicitCastExpr : public CastExpr {
protected:
ExplicitCastExpr(StmtClass SC, QualType exprTy, CastKind kind,
Expr *op, TypeSourceInfo *writtenTy)
- : CastExpr(SC, exprTy, kind, op, 0), TInfo(writtenTy) {}
+ : CastExpr(SC, exprTy, kind, op, CXXBaseSpecifierArray()),
+ TInfo(writtenTy) {}
/// \brief Construct an empty explicit cast.
ExplicitCastExpr(StmtClass SC, EmptyShell Shell)
diff --git a/include/clang/AST/UsuallyTinyPtrVector.h b/include/clang/AST/UsuallyTinyPtrVector.h
index f983c4e8e3..5bf3ee9464 100644
--- a/include/clang/AST/UsuallyTinyPtrVector.h
+++ b/include/clang/AST/UsuallyTinyPtrVector.h
@@ -34,6 +34,8 @@ class UsuallyTinyPtrVector {
public:
UsuallyTinyPtrVector() : Storage(0) { }
+ bool empty() const { return !Storage; }
+
typedef const T **iterator;
iterator begin() const;
iterator end() const;
diff --git a/lib/AST/ASTImporter.cpp b/lib/AST/ASTImporter.cpp
index 9766d3a370..d9557d3e4c 100644
--- a/lib/AST/ASTImporter.cpp
+++ b/lib/AST/ASTImporter.cpp
@@ -2885,9 +2885,10 @@ Expr *ASTNodeImporter::VisitImplicitCastExpr(ImplicitCastExpr *E) {
if (!SubExpr)
return 0;
+ // FIXME: Initialize the base path.
+ CXXBaseSpecifierArray BasePath;
return new (Importer.getToContext()) ImplicitCastExpr(T, E->getCastKind(),
- SubExpr,
- /* FIXME: */0,
+ SubExpr, BasePath,
E->isLvalueCast());
}
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index b342507e70..72ffe00f48 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -654,8 +654,7 @@ const char *CastExpr::getCastKindName() const {
void CastExpr::DoDestroy(ASTContext &C)
{
- if (BasePath)
- BasePath->Destroy();
+ BasePath.Destroy();
Expr::DoDestroy(C);
}
diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp
index fa21a39ff8..1ff30f2634 100644
--- a/lib/CodeGen/CGObjC.cpp
+++ b/lib/CodeGen/CGObjC.cpp
@@ -381,7 +381,7 @@ void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP,
if (getContext().getCanonicalType(Ivar->getType()) !=
getContext().getCanonicalType(ArgDecl->getType())) {
ImplicitCastExpr ArgCasted(Ivar->getType(), CastExpr::CK_BitCast, &Arg,
- 0, false);
+ CXXBaseSpecifierArray(), false);
BinaryOperator Assign(&IvarRef, &ArgCasted, BinaryOperator::Assign,
Ivar->getType(), Loc);
EmitStmt(&Assign);
diff --git a/lib/Frontend/RewriteObjC.cpp b/lib/Frontend/RewriteObjC.cpp
index fc674354c4..e3d9955387 100644
--- a/lib/Frontend/RewriteObjC.cpp
+++ b/lib/Frontend/RewriteObjC.cpp
@@ -2087,7 +2087,7 @@ CallExpr *RewriteObjC::SynthesizeCallToFunctionDecl(
QualType pToFunc = Context->getPointerType(msgSendType);
ImplicitCastExpr *ICE =
new (Context) ImplicitCastExpr(pToFunc, CastExpr::CK_Unknown,
- DRE, /*InheritancePath=*/0,
+ DRE, CXXBaseSpecifierArray(),
/*isLvalue=*/false);
const FunctionType *FT = msgSendType->getAs<FunctionType>();
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp
index ad4be1a3ab..6975da0b3e 100644
--- a/lib/Sema/Sema.cpp
+++ b/lib/Sema/Sema.cpp
@@ -159,8 +159,7 @@ Sema::~Sema() {
/// If isLvalue, the result of the cast is an lvalue.
void Sema::ImpCastExprToType(Expr *&Expr, QualType Ty,
CastExpr::CastKind Kind,
- CXXBaseSpecifierArray *BasePath,
- bool isLvalue) {
+ bool isLvalue, CXXBaseSpecifierArray BasePath) {
QualType ExprTy = Context.getCanonicalType(Expr->getType());
QualType TypeTy = Context.getCanonicalType(Ty);
@@ -180,7 +179,7 @@ void Sema::ImpCastExprToType(Expr *&Expr, QualType Ty,
if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(Expr)) {
if (ImpCast->getCastKind() == Kind) {
- assert(!BasePath && "FIXME: Merge paths!");
+ assert(BasePath.empty() && "FIXME: Merge paths!");
ImpCast->setType(Ty);
ImpCast->setLvalueCast(isLvalue);
return;
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 862de98e1b..48b12b5712 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -3959,8 +3959,9 @@ public:
/// cast. If there is already an implicit cast, merge into the existing one.
/// If isLvalue, the result of the cast is an lvalue.
void ImpCastExprToType(Expr *&Expr, QualType Type, CastExpr::CastKind Kind,
- CXXBaseSpecifierArray *BasePath = 0,
- bool isLvalue = false);
+ bool isLvalue = false,
+ CXXBaseSpecifierArray BasePath =
+ CXXBaseSpecifierArray());
// UsualUnaryConversions - promotes integers (C99 6.3.1.1p2) and converts
// functions and arrays to their respective pointers (C99 6.3.2.1).
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index bf2cba10c7..20e4200fbe 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -6511,7 +6511,7 @@ void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
ECD->setInitExpr(new (Context) ImplicitCastExpr(NewTy,
CastExpr::CK_IntegralCast,
ECD->getInitExpr(),
- /*InheritancePath=*/0,
+ CXXBaseSpecifierArray(),
/*isLvalue=*/false));
if (getLangOptions().CPlusPlus)
// C++ [dcl.enum]p4: Following the closing brace of an
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index f5ecff8184..02c41da30b 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1443,7 +1443,6 @@ Sema::PerformObjectMemberConversion(Expr *&From,
if (PointerConversions)
QType = Context.getPointerType(QType);
ImpCastExprToType(From, QType, CastExpr::CK_UncheckedDerivedToBase,
- /*FIXME: InheritancePath=*/0,
/*isLvalue=*/!PointerConversions);
FromType = QType;
@@ -1480,7 +1479,6 @@ Sema::PerformObjectMemberConversion(Expr *&From,
if (PointerConversions)
UType = Context.getPointerType(UType);
ImpCastExprToType(From, UType, CastExpr::CK_UncheckedDerivedToBase,
- /*FIXME: InheritancePath=*/0,
/*isLvalue*/ !PointerConversions);
FromType = UType;
FromRecordType = URecordType;
@@ -1499,7 +1497,6 @@ Sema::PerformObjectMemberConversion(Expr *&From,
return true;
ImpCastExprToType(From, DestType, CastExpr::CK_UncheckedDerivedToBase,
- /*FIXME: InheritancePath=*/0,
/*isLvalue=*/!PointerConversions);
return false;
}
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 042f2c14ab..71d8914761 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -341,7 +341,7 @@ Sema::ActOnCXXTypeid(SourceLocation OpLoc, SourceLocation LParenLoc,
// type.
if (T.hasQualifiers()) {
ImpCastExprToType(E, T.getUnqualifiedType(), CastExpr::CK_NoOp,
- /*InheritancePath=*/0, E->isLvalue(Context));
+ E->isLvalue(Context));
TyOrExpr = E;
}
}
@@ -392,7 +392,6 @@ bool Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, Expr *&E) {
// or "pointer to function returning T", [...]
if (E->getType().hasQualifiers())
ImpCastExprToType(E, E->getType().getUnqualifiedType(), CastExpr::CK_NoOp,
- /*InheritancePath=*/0,
E->isLvalue(Context) == Expr::LV_Valid);
DefaultFunctionArrayConversion(E);
@@ -1792,8 +1791,7 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType,
// FIXME: Not sure about lvalue vs rvalue here in the presence of rvalue
// references.
ImpCastExprToType(From, ToType.getNonReferenceType(),
- CastExpr::CK_NoOp, /*InheritancePath=*/0,
- ToType->isLValueReferenceType());
+ CastExpr::CK_NoOp, ToType->isLValueReferenceType());
if (SCS.DeprecatedStringLiteralToCharPtr)
Diag(From->getLocStart(), diag::warn_deprecated_string_literal_conversion)
@@ -1887,8 +1885,7 @@ QualType Sema::CheckPointerToMemberOperands(
// Cast LHS to type of use.
QualType UseType = isIndirect ? Context.getPointerType(Class) : Class;
bool isLValue = !isIndirect && lex->isLvalue(Context) == Expr::LV_Valid;
- ImpCastExprToType(lex, UseType, CastExpr::CK_DerivedToBase,
- /*FIXME: InheritancePath=*/0, isLValue);
+ ImpCastExprToType(lex, UseType, CastExpr::CK_DerivedToBase, isLValue);
}
if (isa<CXXZeroInitValueExpr>(rex->IgnoreParens())) {
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 904489cdd9..90c8e3bac6 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -3468,7 +3468,7 @@ InitializationSequence::Perform(Sema &S,
CurInit = S.Owned(new (S.Context) ImplicitCastExpr(Step->Type,
CastExpr::CK_DerivedToBase,
(Expr*)CurInit.release(),
- /*FIXME:InheritancePath=*/0,
+ CXXBaseSpecifierArray(),
Step->Kind == SK_CastDerivedToBaseLValue));
break;
}
@@ -3586,10 +3586,10 @@ InitializationSequence::Perform(Sema &S,
CurInitExpr = CurInit.takeAs<Expr>();
CurInit = S.Owned(new (S.Context) ImplicitCastExpr(CurInitExpr->getType(),
- CastKind,
- CurInitExpr,
- /*InheritancePath=*/0,
- IsLvalue));
+ CastKind,
+ CurInitExpr,
+ CXXBaseSpecifierArray(),
+ IsLvalue));
if (RequiresCopy)
CurInit = CopyObject(S, Entity.getType().getNonReferenceType(), Entity,
@@ -3601,7 +3601,7 @@ InitializationSequence::Perform(Sema &S,
case SK_QualificationConversionRValue:
// Perform a qualification conversion; these can never go wrong.
S.ImpCastExprToType(CurInitExpr, Step->Type,
- CastExpr::CK_NoOp, /*InheritancePath=*/0,
+ CastExpr::CK_NoOp,
Step->Kind == SK_QualificationConversionLValue);
CurInit.release();
CurInit = S.Owned(CurInitExpr);
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 732b9ee3eb..50afb7e1bc 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -2675,8 +2675,8 @@ Sema::PerformObjectArgumentInitialization(Expr *&From,
return PerformObjectMemberConversion(From, Qualifier, FoundDecl, Method);
if (!Context.hasSameType(From->getType(), DestType))
- ImpCastExprToType(From, DestType, CastExpr::CK_NoOp, /*InheritancePath=*/0,
- /*isLvalue=*/!From->getType()->getAs<PointerType>());
+ ImpCastExprToType(From, DestType, CastExpr::CK_NoOp,
+ /*isLvalue=*/!From->getType()->isPointerType());
return false;
}
@@ -3157,7 +3157,7 @@ Sema::AddConversionCandidate(CXXConversionDecl *Conversion,
From->getLocStart());
ImplicitCastExpr ConversionFn(Context.getPointerType(Conversion->getType()),
CastExpr::CK_FunctionToPointerDecay,
- &ConversionRef, /*InheritancePath=*/0, false);
+ &ConversionRef, CXXBaseSpecifierArray(), false);
// Note that it is safe to allocate CallExpr on the stack here because
// there are 0 arguments (i.e., nothing is allocated using ASTContext's
@@ -6859,8 +6859,7 @@ Expr *Sema::FixOverloadedFunctionReference(Expr *E, DeclAccessPair Found,
return new (Context) ImplicitCastExpr(ICE->getType(),
ICE->getCastKind(),
- SubExpr,
- /*InheritancePath=*/0,
+ SubExpr, CXXBaseSpecifierArray(),
ICE->isLvalueCast());
}
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index 14d04563d6..7e7413f296 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -2868,7 +2868,6 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
if (IsQualificationConversion(ArgType, ParamType.getNonReferenceType())) {
ImpCastExprToType(Arg, ParamType, CastExpr::CK_NoOp,
- /*InheritancePath=*/0,
Arg->isLvalue(Context) == Expr::LV_Valid);
} else if (!Context.hasSameUnqualifiedType(ArgType,
ParamType.getNonReferenceType())) {
@@ -2933,7 +2932,6 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
// Types match exactly: nothing more to do here.
} else if (IsQualificationConversion(ArgType, ParamType)) {
ImpCastExprToType(Arg, ParamType, CastExpr::CK_NoOp,
- /*InheritancePath=*/0,
Arg->isLvalue(Context) == Expr::LV_Valid);
} else {
// We can't perform this conversion.