r352323 - [SemaCXX] Fix ICE with structure bindings to members of template

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 28 05:47:08 PST 2019


Thanks for letting me know! Merged in r352356.

On Sun, Jan 27, 2019 at 12:06 PM Richard Smith <richard at metafoo.co.uk> wrote:
>
> Hi Hans,
>
> This is a safe change that fixes a crash; it'd be good to get this into clang 8.
>
> Thanks!
>
> On Sun, 27 Jan 2019, 11:19 Nicolas Lesser via cfe-commits, <cfe-commits at lists.llvm.org> wrote:
>>
>> Author: rakete1111
>> Date: Sun Jan 27 11:19:59 2019
>> New Revision: 352323
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=352323&view=rev
>> Log:
>> [SemaCXX] Fix ICE with structure bindings to members of template
>>
>> Summary:
>> Trying to use structure binding with a structure that doesn't implement
>> std::tuple_size, should unpack the data members. When the struct is a
>> template though, clang might hit an assertion (if the type has not been
>> completed before), because CXXRecordDecl::DefinitionData is nullptr.
>>
>> This commit fixes the problem by completing the type while trying to
>> decompose the structured binding.
>>
>> The ICE happens in real world code, for example, when trying to iterate
>> a protobuf generated map with a range-based for loop and structure
>> bindings (because google::protobuf::MapPair is a template and doesn't
>> support std::tuple_size).
>>
>> Reported-by: nicholas.sun at nlsun.com
>>
>> Patch by Daniele Di Proietto
>>
>> Reviewers: #clang, rsmith
>>
>> Reviewed By: #clang, rsmith
>>
>> Subscribers: cpplearner, Rakete1111, cfe-commits
>>
>> Tags: #clang
>>
>> Differential Revision: https://reviews.llvm.org/D56974
>>
>>
>> Modified:
>>     cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>>     cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp
>>
>> Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclCXX.cpp?rev=352323&r1=352322&r2=352323&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Sun Jan 27 11:19:59 2019
>> @@ -1300,6 +1300,10 @@ static DeclAccessPair findDecomposableBa
>>  static bool checkMemberDecomposition(Sema &S, ArrayRef<BindingDecl*> Bindings,
>>                                       ValueDecl *Src, QualType DecompType,
>>                                       const CXXRecordDecl *OrigRD) {
>> +  if (S.RequireCompleteType(Src->getLocation(), DecompType,
>> +                            diag::err_incomplete_type))
>> +    return true;
>> +
>>    CXXCastPath BasePath;
>>    DeclAccessPair BasePair =
>>        findDecomposableBaseClass(S, Src->getLocation(), OrigRD, BasePath);
>>
>> Modified: cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp?rev=352323&r1=352322&r2=352323&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/cxx1z-decomposition.cpp Sun Jan 27 11:19:59 2019
>> @@ -81,4 +81,21 @@ struct PR37352 {
>>    void f() { static auto [a] = *this; } // expected-error {{cannot be declared 'static'}}
>>  };
>>
>> +namespace instantiate_template {
>> +
>> +template <typename T1, typename T2>
>> +struct pair {
>> +  T1 a;
>> +  T2 b;
>> +};
>> +
>> +const pair<int, int> &f1();
>> +
>> +int f2() {
>> +  const auto &[a, b] = f1();
>> +  return a + b;
>> +}
>> +
>> +} // namespace instantiate_template
>> +
>>  // FIXME: by-value array copies
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list