diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp | 26 | 
1 files changed, 21 insertions, 5 deletions
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp index 2144845f4dd3..f2b1963df1ed 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaOverload.cpp @@ -5145,7 +5145,8 @@ Sema::PerformObjectArgumentInitialization(Expr *From,        *this, From->getLocStart(), From->getType(), FromClassification, Method,        Method->getParent());    if (ICS.isBad()) { -    if (ICS.Bad.Kind == BadConversionSequence::bad_qualifiers) { +    switch (ICS.Bad.Kind) { +    case BadConversionSequence::bad_qualifiers: {        Qualifiers FromQs = FromRecordType.getQualifiers();        Qualifiers ToQs = DestType.getQualifiers();        unsigned CVR = FromQs.getCVRQualifiers() & ~ToQs.getCVRQualifiers(); @@ -5158,10 +5159,28 @@ Sema::PerformObjectArgumentInitialization(Expr *From,            << Method->getDeclName();          return ExprError();        } +      break; +    } + +    case BadConversionSequence::lvalue_ref_to_rvalue: +    case BadConversionSequence::rvalue_ref_to_lvalue: { +      bool IsRValueQualified = +        Method->getRefQualifier() == RefQualifierKind::RQ_RValue; +      Diag(From->getLocStart(), diag::err_member_function_call_bad_ref) +        << Method->getDeclName() << FromClassification.isRValue() +        << IsRValueQualified; +      Diag(Method->getLocation(), diag::note_previous_decl) +        << Method->getDeclName(); +      return ExprError(); +    } + +    case BadConversionSequence::no_conversion: +    case BadConversionSequence::unrelated_class: +      break;      }      return Diag(From->getLocStart(), -                diag::err_implicit_object_parameter_init) +                diag::err_member_function_call_bad_type)         << ImplicitParamRecordType << FromRecordType << From->getSourceRange();    } @@ -11309,9 +11328,6 @@ Sema::ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl,    return Matched;  } - - -  // Resolve and fix an overloaded expression that can be resolved  // because it identifies a single function template specialization.  //  | 
