Author: Richard Smith Date: 2021-01-13T17:41:09-08:00 New Revision: cd4c55c97402246099ae865a66517a36af5c3a7c
URL: https://github.com/llvm/llvm-project/commit/cd4c55c97402246099ae865a66517a36af5c3a7c DIFF: https://github.com/llvm/llvm-project/commit/cd4c55c97402246099ae865a66517a36af5c3a7c.diff LOG: Fix grammar in diagnostic for wrong arity in a structured binding. Added: Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaDeclCXX.cpp clang/test/SemaCXX/cxx1z-decomposition.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b387736832a9..7d36397a7993 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -470,8 +470,9 @@ def err_decomp_decl_not_alone : Error< def err_decomp_decl_requires_init : Error< "decomposition declaration %0 requires an initializer">; def err_decomp_decl_wrong_number_bindings : Error< - "type %0 decomposes into %2 elements, but %select{only |}3%1 " - "names were provided">; + "type %0 decomposes into %3 %plural{1:element|:elements}2, but " + "%select{%plural{0:no|:only %1}1|%1}4 " + "%plural{1:name was|:names were}1 provided">; def err_decomp_decl_unbindable_type : Error< "cannot decompose %select{union|non-class, non-array}1 type %2">; def err_decomp_decl_multiple_bases_with_members : Error< diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 0df022f036f2..27679ac6f8d3 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -902,7 +902,8 @@ static bool checkSimpleDecomposition( llvm::function_ref<ExprResult(SourceLocation, Expr *, unsigned)> GetInit) { if ((int64_t)Bindings.size() != NumElems) { S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings) - << DecompType << (unsigned)Bindings.size() << NumElems.toString(10) + << DecompType << (unsigned)Bindings.size() + << (unsigned)NumElems.getLimitedValue(UINT_MAX) << NumElems.toString(10) << (NumElems < Bindings.size()); return true; } @@ -1148,8 +1149,9 @@ static bool checkTupleLikeDecomposition(Sema &S, const llvm::APSInt &TupleSize) { if ((int64_t)Bindings.size() != TupleSize) { S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings) - << DecompType << (unsigned)Bindings.size() << TupleSize.toString(10) - << (TupleSize < Bindings.size()); + << DecompType << (unsigned)Bindings.size() + << (unsigned)TupleSize.getLimitedValue(UINT_MAX) + << TupleSize.toString(10) << (TupleSize < Bindings.size()); return true; } @@ -1373,7 +1375,7 @@ static bool checkMemberDecomposition(Sema &S, ArrayRef<BindingDecl*> Bindings, [](FieldDecl *FD) { return !FD->isUnnamedBitfield(); }); assert(Bindings.size() != NumFields); S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings) - << DecompType << (unsigned)Bindings.size() << NumFields + << DecompType << (unsigned)Bindings.size() << NumFields << NumFields << (NumFields < Bindings.size()); return true; }; diff --git a/clang/test/SemaCXX/cxx1z-decomposition.cpp b/clang/test/SemaCXX/cxx1z-decomposition.cpp index 45a062a916f3..1ce75fe48db3 100644 --- a/clang/test/SemaCXX/cxx1z-decomposition.cpp +++ b/clang/test/SemaCXX/cxx1z-decomposition.cpp @@ -4,6 +4,21 @@ void use_from_own_init() { auto [a] = a; // expected-error {{binding 'a' cannot appear in the initializer of its own decomposition declaration}} } +void num_elems() { + struct A0 {} a0; + int a1[1], a2[2]; + + auto [] = a0; // expected-warning {{does not allow a decomposition group to be empty}} + auto [v1] = a0; // expected-error {{type 'A0' decomposes into 0 elements, but 1 name was provided}} + auto [] = a1; // expected-error {{type 'int [1]' decomposes into 1 element, but no names were provided}} expected-warning {{empty}} + auto [v2] = a1; + auto [v3, v4] = a1; // expected-error {{type 'int [1]' decomposes into 1 element, but 2 names were provided}} + auto [] = a2; // expected-error {{type 'int [2]' decomposes into 2 elements, but no names were provided}} expected-warning {{empty}} + auto [v5] = a2; // expected-error {{type 'int [2]' decomposes into 2 elements, but only 1 name was provided}} + auto [v6, v7] = a2; + auto [v8, v9, v10] = a2; // expected-error {{type 'int [2]' decomposes into 2 elements, but 3 names were provided}} +} + // As a Clang extension, _Complex can be decomposed. float decompose_complex(_Complex float cf) { static _Complex float scf; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits