You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by "abhishek593 (via GitHub)" <gi...@apache.org> on 2026/02/20 19:06:13 UTC

Re: [PR] GH-48590: [C++] Modernize type traits using C++20 concepts (Preliminary) [arrow]

abhishek593 commented on PR #49348:
URL: https://github.com/apache/arrow/pull/49348#issuecomment-3936596863

   @pitrou I just want to post my analysis here.
   
   The code so far what I have submitted is standard-compliant (compiles on gcc-14, gcc-15, clang). But the check [C++ / C++ Minimal Build Example](https://github.com/apache/arrow/actions/runs/22235190347/job/64324893309?pr=49348) fails which uses gcc-13. This is because of a bug in gcc-13 when evaluating concept-constrained partial specialisation of nested templates. Hence, the error:
   
   
   Error from CI:
   
   ```
   /arrow/cpp/src/arrow/compute/kernels/codegen_internal.h:736:21: error: 'Arg0Value' has not been declared
   
     736 |           arg0, [&](Arg0Value v) { return builder.Append(functor.op.Call(ctx, v, &st)); },
   ```
   Code from codegen_internal.h(present in my changes):
   
   ```
   template <arrow_c_number_or_decimal Type>
   struct ArrayExec<Type> {
     static Status Exec(...) {
       // GCC 13 throws an error on `Arg0Value` and `OutValue` inside this lambda
       VisitArrayValuesInline<Arg0Type>(arg0, [&](Arg0Value v) {
         *out_data++ = functor.op.template Call<OutValue, Arg0Value>(ctx, v, &st);
       });
     }
   };
   ```
   
   Since CI uses these older compilers, we may have a few options if we want to proceed:
   
   1. Explicit qualification: Explicitly qualify the types wherever they are used inside the specialisation
   
   ```diff
   -   VisitArrayValuesInline<Arg0Type>(arg0, [&](Arg0Value v) {
   -      *out_data++ = functor.op.template Call<OutValue, Arg0Value>(ctx, v, &st);
   +   VisitArrayValuesInline<Arg0Type>(arg0, [&](typename ThisType::Arg0Value v) {
   +      *out_data++ = functor.op.template Call<typename ThisType::OutValue, typename ThisType::Arg0Value>(ctx, v, &st);
   ```
   
   2. Identify such instances and fallback to SFINAE (lot of work).
   3. Upgrade CI compilers.
   
   BTW, is there any reason why compilers are not being upgraded?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org