зеркало из https://github.com/microsoft/clang-1.git
Enable constant evaluation of implicit calls to constexpr conversion operators.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148333 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
a8398ea850
Коммит
7d580a4e9e
|
@ -2280,6 +2280,7 @@ public:
|
||||||
case CK_AtomicToNonAtomic:
|
case CK_AtomicToNonAtomic:
|
||||||
case CK_NonAtomicToAtomic:
|
case CK_NonAtomicToAtomic:
|
||||||
case CK_NoOp:
|
case CK_NoOp:
|
||||||
|
case CK_UserDefinedConversion:
|
||||||
return StmtVisitorTy::Visit(E->getSubExpr());
|
return StmtVisitorTy::Visit(E->getSubExpr());
|
||||||
|
|
||||||
case CK_LValueToRValue: {
|
case CK_LValueToRValue: {
|
||||||
|
@ -4525,13 +4526,13 @@ bool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {
|
||||||
case CK_BitCast:
|
case CK_BitCast:
|
||||||
case CK_Dependent:
|
case CK_Dependent:
|
||||||
case CK_LValueBitCast:
|
case CK_LValueBitCast:
|
||||||
case CK_UserDefinedConversion:
|
|
||||||
case CK_ARCProduceObject:
|
case CK_ARCProduceObject:
|
||||||
case CK_ARCConsumeObject:
|
case CK_ARCConsumeObject:
|
||||||
case CK_ARCReclaimReturnedObject:
|
case CK_ARCReclaimReturnedObject:
|
||||||
case CK_ARCExtendBlockObject:
|
case CK_ARCExtendBlockObject:
|
||||||
return Error(E);
|
return Error(E);
|
||||||
|
|
||||||
|
case CK_UserDefinedConversion:
|
||||||
case CK_LValueToRValue:
|
case CK_LValueToRValue:
|
||||||
case CK_AtomicToNonAtomic:
|
case CK_AtomicToNonAtomic:
|
||||||
case CK_NonAtomicToAtomic:
|
case CK_NonAtomicToAtomic:
|
||||||
|
|
|
@ -687,6 +687,28 @@ static_assert((Bottom*)nullB == 0, "");
|
||||||
static_assert((Derived*)nullB == 0, "");
|
static_assert((Derived*)nullB == 0, "");
|
||||||
static_assert((void*)(Bottom*)nullB == (void*)(Derived*)nullB, "");
|
static_assert((void*)(Bottom*)nullB == (void*)(Derived*)nullB, "");
|
||||||
|
|
||||||
|
namespace ConversionOperators {
|
||||||
|
|
||||||
|
struct T {
|
||||||
|
constexpr T(int n) : k(5*n - 3) {}
|
||||||
|
constexpr operator int() { return k; }
|
||||||
|
int k;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct S {
|
||||||
|
constexpr S(int n) : k(2*n + 1) {}
|
||||||
|
constexpr operator int() { return k; }
|
||||||
|
constexpr operator T() { return T(k); }
|
||||||
|
int k;
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr bool check(T a, T b) { return a == b.k; }
|
||||||
|
|
||||||
|
static_assert(S(5) == 11, "");
|
||||||
|
static_assert(check(S(5), 11), "");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Temporaries {
|
namespace Temporaries {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче