From 8c5c60a493ca31c7e808ca48a99ed4bd5900b43d Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 21 Feb 2020 17:12:44 +0000 Subject: [PATCH] [Sema][SVE] Reject by-copy capture of sizeless types Since fields can't have sizeless type, it also doesn't make sense to capture sizeless types by value in lambda expressions. This patch makes sure that we diagnose that and that we use "sizeless type" rather "incomplete type" in the associated message. (Both are correct, but "sizeless type" is more specific and hopefully more user-friendly.) Differential Revision: https://reviews.llvm.org/D75738 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 ++-- clang/lib/Sema/SemaExpr.cpp | 7 ++++--- clang/test/SemaCXX/sizeless-1.cpp | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4966942..936edf2 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1476,8 +1476,8 @@ def err_throw_abstract_type : Error< def err_array_of_abstract_type : Error<"array of abstract class type %0">; def err_capture_of_abstract_type : Error< "by-copy capture of value of abstract type %0">; -def err_capture_of_incomplete_type : Error< - "by-copy capture of variable %0 with incomplete type %1">; +def err_capture_of_incomplete_or_sizeless_type : Error< + "by-copy capture of variable %0 with %select{incomplete|sizeless}1 type %2">; def err_capture_default_non_local : Error< "non-local lambda expression cannot have a capture-default">; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 8cc5ac2..eaf22fe 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -16356,9 +16356,10 @@ static bool captureInLambda(LambdaScopeInfo *LSI, // Make sure that by-copy captures are of a complete and non-abstract type. if (!Invalid && BuildAndDiagnose) { if (!CaptureType->isDependentType() && - S.RequireCompleteType(Loc, CaptureType, - diag::err_capture_of_incomplete_type, - Var->getDeclName())) + S.RequireCompleteSizedType( + Loc, CaptureType, + diag::err_capture_of_incomplete_or_sizeless_type, + Var->getDeclName())) Invalid = true; else if (S.RequireNonAbstractType(Loc, CaptureType, diag::err_capture_of_abstract_type)) diff --git a/clang/test/SemaCXX/sizeless-1.cpp b/clang/test/SemaCXX/sizeless-1.cpp index 48453f5..f776c47 100644 --- a/clang/test/SemaCXX/sizeless-1.cpp +++ b/clang/test/SemaCXX/sizeless-1.cpp @@ -499,6 +499,7 @@ void cxx_only(int sel) { #if __cplusplus >= 201703L auto fn3 = [a(return_int8())] {}; // expected-error {{field has sizeless type '__SVInt8_t'}} #endif + auto fn4 = [local_int8](svint8_t *ptr) { *ptr = local_int8; }; // expected-error {{by-copy capture of variable 'local_int8' with sizeless type 'svint8_t'}} for (auto x : local_int8) { // expected-error {{no viable 'begin' function available}} } -- 2.7.4