diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/Sema/SemaInit.cpp')
| -rw-r--r-- | contrib/llvm-project/clang/lib/Sema/SemaInit.cpp | 55 | 
1 files changed, 26 insertions, 29 deletions
diff --git a/contrib/llvm-project/clang/lib/Sema/SemaInit.cpp b/contrib/llvm-project/clang/lib/Sema/SemaInit.cpp index cc9db5ded114..408ee5f77580 100644 --- a/contrib/llvm-project/clang/lib/Sema/SemaInit.cpp +++ b/contrib/llvm-project/clang/lib/Sema/SemaInit.cpp @@ -7589,7 +7589,8 @@ static void visitLifetimeBoundArguments(IndirectLocalPath &Path, Expr *Call,    bool CheckCoroCall = false;    if (const auto *RD = Callee->getReturnType()->getAsRecordDecl()) {      CheckCoroCall = RD->hasAttr<CoroLifetimeBoundAttr>() && -                    RD->hasAttr<CoroReturnTypeAttr>(); +                    RD->hasAttr<CoroReturnTypeAttr>() && +                    !Callee->hasAttr<CoroDisableLifetimeBoundAttr>();    }    for (unsigned I = 0,                  N = std::min<unsigned>(Callee->getNumParams(), Args.size()); @@ -10376,11 +10377,6 @@ void InitializationSequence::dump() const {    dump(llvm::errs());  } -static bool NarrowingErrs(const LangOptions &L) { -  return L.CPlusPlus11 && -         (!L.MicrosoftExt || L.isCompatibleWithMSVC(LangOptions::MSVC2015)); -} -  static void DiagnoseNarrowingInInitList(Sema &S,                                          const ImplicitConversionSequence &ICS,                                          QualType PreNarrowingType, @@ -10401,6 +10397,19 @@ static void DiagnoseNarrowingInInitList(Sema &S,      return;    } +  auto MakeDiag = [&](bool IsConstRef, unsigned DefaultDiagID, +                      unsigned ConstRefDiagID, unsigned WarnDiagID) { +    unsigned DiagID; +    auto &L = S.getLangOpts(); +    if (L.CPlusPlus11 && +        (!L.MicrosoftExt || L.isCompatibleWithMSVC(LangOptions::MSVC2015))) +      DiagID = IsConstRef ? ConstRefDiagID : DefaultDiagID; +    else +      DiagID = WarnDiagID; +    return S.Diag(PostInit->getBeginLoc(), DiagID) +           << PostInit->getSourceRange(); +  }; +    // C++11 [dcl.init.list]p7: Check whether this is a narrowing conversion.    APValue ConstantValue;    QualType ConstantType; @@ -10416,13 +10425,9 @@ static void DiagnoseNarrowingInInitList(Sema &S,      // narrowing conversion even if the value is a constant and can be      // represented exactly as an integer.      QualType T = EntityType.getNonReferenceType(); -    S.Diag(PostInit->getBeginLoc(), -           NarrowingErrs(S.getLangOpts()) -               ? (T == EntityType -                      ? diag::ext_init_list_type_narrowing -                      : diag::ext_init_list_type_narrowing_const_reference) -               : diag::warn_init_list_type_narrowing) -        << PostInit->getSourceRange() +    MakeDiag(T != EntityType, diag::ext_init_list_type_narrowing, +             diag::ext_init_list_type_narrowing_const_reference, +             diag::warn_init_list_type_narrowing)          << PreNarrowingType.getLocalUnqualifiedType()          << T.getLocalUnqualifiedType();      break; @@ -10430,14 +10435,10 @@ static void DiagnoseNarrowingInInitList(Sema &S,    case NK_Constant_Narrowing: {      // A constant value was narrowed. -    QualType T = EntityType.getNonReferenceType(); -    S.Diag(PostInit->getBeginLoc(), -           NarrowingErrs(S.getLangOpts()) -               ? (T == EntityType -                      ? diag::ext_init_list_constant_narrowing -                      : diag::ext_init_list_constant_narrowing_const_reference) -               : diag::warn_init_list_constant_narrowing) -        << PostInit->getSourceRange() +    MakeDiag(EntityType.getNonReferenceType() != EntityType, +             diag::ext_init_list_constant_narrowing, +             diag::ext_init_list_constant_narrowing_const_reference, +             diag::warn_init_list_constant_narrowing)          << ConstantValue.getAsString(S.getASTContext(), ConstantType)          << EntityType.getNonReferenceType().getLocalUnqualifiedType();      break; @@ -10445,14 +10446,10 @@ static void DiagnoseNarrowingInInitList(Sema &S,    case NK_Variable_Narrowing: {      // A variable's value may have been narrowed. -    QualType T = EntityType.getNonReferenceType(); -    S.Diag(PostInit->getBeginLoc(), -           NarrowingErrs(S.getLangOpts()) -               ? (T == EntityType -                      ? diag::ext_init_list_variable_narrowing -                      : diag::ext_init_list_variable_narrowing_const_reference) -               : diag::warn_init_list_variable_narrowing) -        << PostInit->getSourceRange() +    MakeDiag(EntityType.getNonReferenceType() != EntityType, +             diag::ext_init_list_variable_narrowing, +             diag::ext_init_list_variable_narrowing_const_reference, +             diag::warn_init_list_variable_narrowing)          << PreNarrowingType.getLocalUnqualifiedType()          << EntityType.getNonReferenceType().getLocalUnqualifiedType();      break;  | 
