diff options
Diffstat (limited to 'lib/AST/ExprConstant.cpp')
| -rw-r--r-- | lib/AST/ExprConstant.cpp | 20 | 
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index e836135cf2f9..0c0c861e5d56 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -1665,6 +1665,19 @@ static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc,    return true;  } +/// Member pointers are constant expressions unless they point to a +/// non-virtual dllimport member function. +static bool CheckMemberPointerConstantExpression(EvalInfo &Info, +                                                 SourceLocation Loc, +                                                 QualType Type, +                                                 const APValue &Value) { +  const ValueDecl *Member = Value.getMemberPointerDecl(); +  const auto *FD = dyn_cast_or_null<CXXMethodDecl>(Member); +  if (!FD) +    return true; +  return FD->isVirtual() || !FD->hasAttr<DLLImportAttr>(); +} +  /// Check that this core constant expression is of literal type, and if not,  /// produce an appropriate diagnostic.  static bool CheckLiteralType(EvalInfo &Info, const Expr *E, @@ -1757,6 +1770,9 @@ static bool CheckConstantExpression(EvalInfo &Info, SourceLocation DiagLoc,      return CheckLValueConstantExpression(Info, DiagLoc, Type, LVal);    } +  if (Value.isMemberPointer()) +    return CheckMemberPointerConstantExpression(Info, DiagLoc, Type, Value); +    // Everything else is fine.    return true;  } @@ -9508,7 +9524,7 @@ bool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {    case BO_Mul:      if (Result.isComplexFloat()) {        // This is an implementation of complex multiplication according to the -      // constraints laid out in C11 Annex G. The implemantion uses the +      // constraints laid out in C11 Annex G. The implemention uses the        // following naming scheme:        //   (a + ib) * (c + id)        ComplexValue LHS = Result; @@ -9589,7 +9605,7 @@ bool ComplexExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {    case BO_Div:      if (Result.isComplexFloat()) {        // This is an implementation of complex division according to the -      // constraints laid out in C11 Annex G. The implemantion uses the +      // constraints laid out in C11 Annex G. The implemention uses the        // following naming scheme:        //   (a + ib) / (c + id)        ComplexValue LHS = Result;  | 
