diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/APValue.cpp | 59 | ||||
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 47 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 9 |
4 files changed, 16 insertions, 110 deletions
diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp index 83b0fb5e1a2..e7902e68780 100644 --- a/clang/lib/AST/APValue.cpp +++ b/clang/lib/AST/APValue.cpp @@ -20,56 +20,6 @@ #include "llvm/Support/raw_ostream.h" using namespace clang; -/// The identity of a type_info object depends on the canonical unqualified -/// type only. -TypeInfoLValue::TypeInfoLValue(const Type *T) - : T(T->getCanonicalTypeUnqualified().getTypePtr()) {} - -void TypeInfoLValue::print(llvm::raw_ostream &Out, - const PrintingPolicy &Policy) const { - Out << "typeid("; - QualType(getType(), 0).print(Out, Policy); - Out << ")"; -} - -static_assert( - 1 << llvm::PointerLikeTypeTraits<TypeInfoLValue>::NumLowBitsAvailable <= - alignof(const Type *), - "Type is insufficiently aligned"); - -APValue::LValueBase APValue::LValueBase::getTypeInfo(TypeInfoLValue LV, - QualType TypeInfo) { - LValueBase Base; - Base.Ptr = LV; - Base.TypeInfoType = TypeInfo.getAsOpaquePtr(); - return Base; -} - -unsigned APValue::LValueBase::getCallIndex() const { - return is<TypeInfoLValue>() ? 0 : Local.CallIndex; -} - -unsigned APValue::LValueBase::getVersion() const { - return is<TypeInfoLValue>() ? 0 : Local.Version; -} - -QualType APValue::LValueBase::getTypeInfoType() const { - assert(is<TypeInfoLValue>() && "not a type_info lvalue"); - return QualType::getFromOpaquePtr(TypeInfoType); -} - -namespace clang { -bool operator==(const APValue::LValueBase &LHS, - const APValue::LValueBase &RHS) { - if (LHS.Ptr != RHS.Ptr) - return false; - if (LHS.is<TypeInfoLValue>()) - return true; - return LHS.Local.CallIndex == RHS.Local.CallIndex && - LHS.Local.Version == RHS.Local.Version; -} -} - namespace { struct LVBase { APValue::LValueBase Base; @@ -110,8 +60,6 @@ llvm::DenseMapInfo<clang::APValue::LValueBase>::getTombstoneKey() { namespace clang { llvm::hash_code hash_value(const APValue::LValueBase &Base) { - if (Base.is<TypeInfoLValue>()) - return llvm::hash_value(Base.getOpaqueValue()); return llvm::hash_combine(Base.getOpaqueValue(), Base.getCallIndex(), Base.getVersion()); } @@ -522,9 +470,7 @@ void APValue::printPretty(raw_ostream &Out, ASTContext &Ctx, QualType Ty) const{ if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>()) Out << *VD; - else if (TypeInfoLValue TI = Base.dyn_cast<TypeInfoLValue>()) { - TI.print(Out, Ctx.getPrintingPolicy()); - } else { + else { assert(Base.get<const Expr *>() != nullptr && "Expecting non-null Expr"); Base.get<const Expr*>()->printPretty(Out, nullptr, @@ -549,9 +495,6 @@ void APValue::printPretty(raw_ostream &Out, ASTContext &Ctx, QualType Ty) const{ if (const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>()) { Out << *VD; ElemTy = VD->getType(); - } else if (TypeInfoLValue TI = Base.dyn_cast<TypeInfoLValue>()) { - TI.print(Out, Ctx.getPrintingPolicy()); - ElemTy = Base.getTypeInfoType(); } else { const Expr *E = Base.get<const Expr*>(); assert(E != nullptr && "Expecting non-null Expr"); diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index e41264e55e4..29b6d12c2f2 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -87,9 +87,6 @@ namespace { return D->getType(); } - if (TypeInfoLValue TI = B.dyn_cast<TypeInfoLValue>()) - return B.getTypeInfoType(); - const Expr *Base = B.get<const Expr*>(); // For a materialized temporary, the type of the temporary we materialized @@ -1786,9 +1783,6 @@ static bool IsGlobalLValue(APValue::LValueBase B) { return isa<FunctionDecl>(D); } - if (B.is<TypeInfoLValue>()) - return true; - const Expr *E = B.get<const Expr*>(); switch (E->getStmtClass()) { default: @@ -1806,6 +1800,7 @@ static bool IsGlobalLValue(APValue::LValueBase B) { case Expr::PredefinedExprClass: case Expr::ObjCStringLiteralClass: case Expr::ObjCEncodeExprClass: + case Expr::CXXTypeidExprClass: case Expr::CXXUuidofExprClass: return true; case Expr::ObjCBoxedExprClass: @@ -1883,9 +1878,9 @@ static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) { const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>(); if (VD) Info.Note(VD->getLocation(), diag::note_declared_at); - else if (const Expr *E = Base.dyn_cast<const Expr*>()) - Info.Note(E->getExprLoc(), diag::note_constexpr_temporary_here); - // We have no information to show for a typeid(T) object. + else + Info.Note(Base.get<const Expr*>()->getExprLoc(), + diag::note_constexpr_temporary_here); } /// Check that this reference or pointer core constant expression is a valid @@ -3409,7 +3404,7 @@ static CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, if (!Frame) { if (const MaterializeTemporaryExpr *MTE = - dyn_cast_or_null<MaterializeTemporaryExpr>(Base)) { + dyn_cast<MaterializeTemporaryExpr>(Base)) { assert(MTE->getStorageDuration() == SD_Static && "should have a frame for a non-global materialized temporary"); @@ -3444,13 +3439,7 @@ static CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, } else { if (!IsAccess) return CompleteObject(LVal.getLValueBase(), nullptr, BaseType); - APValue Val; - LVal.moveInto(Val); - Info.FFDiag(E, diag::note_constexpr_access_unreadable_object) - << AK - << Val.getAsString(Info.Ctx, - Info.Ctx.getLValueReferenceType(LValType)); - NoteLValueLocation(Info, LVal.Base); + Info.FFDiag(E); return CompleteObject(); } } else { @@ -5788,13 +5777,13 @@ public: // - Literals // * CompoundLiteralExpr in C (and in global scope in C++) // * StringLiteral +// * CXXTypeidExpr // * PredefinedExpr // * ObjCStringLiteralExpr // * ObjCEncodeExpr // * AddrLabelExpr // * BlockExpr // * CallExpr for a MakeStringConstant builtin -// - typeid(T) expressions, as TypeInfoLValues // - Locals and temporaries // * MaterializeTemporaryExpr // * Any Expr, with a CallIndex indicating the function in which the temporary @@ -6029,14 +6018,8 @@ LValueExprEvaluator::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) { } bool LValueExprEvaluator::VisitCXXTypeidExpr(const CXXTypeidExpr *E) { - if (!E->isPotentiallyEvaluated()) { - TypeInfoLValue TypeInfo; - if (E->isTypeOperand()) - TypeInfo = TypeInfoLValue(E->getTypeOperand(Info.Ctx).getTypePtr()); - else - TypeInfo = TypeInfoLValue(E->getExprOperand()->getType().getTypePtr()); - return Success(APValue::LValueBase::getTypeInfo(TypeInfo, E->getType())); - } + if (!E->isPotentiallyEvaluated()) + return Success(E); Info.FFDiag(E, diag::note_constexpr_typeid_polymorphic) << E->getExprOperand()->getType() @@ -6632,11 +6615,9 @@ bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, if (const ValueDecl *VD = OffsetResult.Base.dyn_cast<const ValueDecl*>()) { BaseAlignment = Info.Ctx.getDeclAlign(VD); - } else if (const Expr *E = OffsetResult.Base.dyn_cast<const Expr *>()) { - BaseAlignment = GetAlignOfExpr(Info, E, UETT_AlignOf); } else { - BaseAlignment = GetAlignOfType( - Info, OffsetResult.Base.getTypeInfoType(), UETT_AlignOf); + BaseAlignment = GetAlignOfExpr( + Info, OffsetResult.Base.get<const Expr *>(), UETT_AlignOf); } if (BaseAlignment < Align) { @@ -8354,10 +8335,6 @@ static bool EvaluateBuiltinConstantPForLValue(const APValue &LV) { if (!isa<StringLiteral>(E)) return false; return LV.getLValueOffset().isZero(); - } else if (Base.is<TypeInfoLValue>()) { - // Surprisingly, GCC considers __builtin_constant_p(&typeid(int)) to - // evaluate to true. - return true; } else { // Any other base is not constant enough for GCC. return false; @@ -8422,8 +8399,6 @@ static QualType getObjectType(APValue::LValueBase B) { } else if (const Expr *E = B.get<const Expr*>()) { if (isa<CompoundLiteralExpr>(E)) return E->getType(); - } else if (B.is<TypeInfoLValue>()) { - return B.getTypeInfoType(); } return QualType(); diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 70904b192a3..dd71cf02d95 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -1735,17 +1735,6 @@ ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) { return nullptr; } - // Handle typeid(T). - if (TypeInfoLValue TI = base.dyn_cast<TypeInfoLValue>()) { - llvm::Type *StdTypeInfoPtrTy = - CGM.getTypes().ConvertType(base.getTypeInfoType())->getPointerTo(); - llvm::Constant *TypeInfo = - CGM.GetAddrOfRTTIDescriptor(QualType(TI.getType(), 0)); - if (TypeInfo->getType() != StdTypeInfoPtrTy) - TypeInfo = llvm::ConstantExpr::getBitCast(TypeInfo, StdTypeInfoPtrTy); - return TypeInfo; - } - // Otherwise, it must be an expression. return Visit(base.get<const Expr*>()); } diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 239b4ae7957..b9d3ff8666f 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -6424,11 +6424,8 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, // -- a string literal // -- the result of a typeid expression, or // -- a predefined __func__ variable - APValue::LValueBase Base = Value.getLValueBase(); - auto *VD = const_cast<ValueDecl *>(Base.dyn_cast<const ValueDecl *>()); - if (Base && !VD) { - auto *E = Base.dyn_cast<const Expr *>(); - if (E && isa<CXXUuidofExpr>(E)) { + if (auto *E = Value.getLValueBase().dyn_cast<const Expr*>()) { + if (isa<CXXUuidofExpr>(E)) { Converted = TemplateArgument(ArgResult.get()->IgnoreImpCasts()); break; } @@ -6436,6 +6433,8 @@ ExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, << Arg->getSourceRange(); return ExprError(); } + auto *VD = const_cast<ValueDecl *>( + Value.getLValueBase().dyn_cast<const ValueDecl *>()); // -- a subobject if (Value.hasLValuePath() && Value.getLValuePath().size() == 1 && VD && VD->getType()->isArrayType() && |