fhahn marked 2 inline comments as done.
fhahn added inline comments.

================
Comment at: clang/lib/Sema/SemaChecking.cpp:15051
+
+  Expr *Arg = TheCall->getArg(0);
+  if (!Arg->getType()->isConstantMatrixType()) {
----------------
rjmccall wrote:
> fhahn wrote:
> > rjmccall wrote:
> > > fhahn wrote:
> > > > rjmccall wrote:
> > > > > When a builtin has custom type-checking (`t`), you need to handle 
> > > > > placeholders in the operands yourself, just like you would for an 
> > > > > operator.
> > > > I added placeholder handling and added additional tests.
> > > Oh, I'm sorry, I gave you poor advice: you do need to handle 
> > > placeholders, but more generally than that, you need an r-value.   Since 
> > > you aren't doing any further conversions, you just need to call 
> > > DefaultLValueConversion, which will also handle placeholders for you.
> > > 
> > > You will also need to store the checked argument back into the call, 
> > > which you can only really test with an IRGen test.  This is one of the 
> > > few places where we do actually directly mutate the AST.
> > Oh right, I wasn't sure about whether we need DefaultLValueConversion here 
> > or not. I tried to construct a C/C++ test case that would actually require 
> > it, but couldn't come up with a test. In any case, I updated it to use 
> > `DefaultLvalueConversion` instead and also adjust the argument before 
> > returning the updated call.
> IRGen is pretty lenient about missing LValueToRValue conversions because of 
> the way it peepholes loads from complex l-value expressions.  But if you have 
> basic `constexpr` stuff working in Sema, I think you can test this with 
> lambdas.  A reference to a `constexpr` variable that's immediately loaded 
> from is not an ODR-use, which means that within a lambda it doesn't result in 
> a capture.  So a test like this should work, and it wouldn't if you didn't 
> generate the LValueToRValue conversion in Sema.   (I think it doesn't 
> actually test that the LValueToRValue conversions is actually added to the 
> AST, though, just that you actually generated the AST node.)
> 
> ```
>   constexpr double4x4 m = {};
>   [] { return __builtin_matrix_transpose(m); }
> ```
Thanks for the example. Unfortunately constexpr for matrix types are not 
supported directly at the moment. Currently we get

```
matrix-type-builtins.cpp:97:26: error: constexpr variable cannot have 
non-literal type 'const double4x4_t' (aka 'double  
__attribute__((matrix_type(4, 4)))const')
   constexpr double4x4_t m = {};
                         ^
```

Something like the code below works, but it requires an explicit capture

```
template <class T, unsigned R, unsigned C>
using matrix_type = T __attribute__((matrix_type(R, C)));

using double4x4_t = double __attribute__((matrix_type(4, 4)));
struct identmatrix_t {
  operator double4x4_t() const {
    double4x4_t result;
    for (unsigned i = 0; i != 4; ++i)
      result[i][i] = 1;
    return result;
  }
};

void test_conversion() {
   constexpr identmatrix_t m2;
 [&m2] { return __builtin_matrix_transpose((double4x4_t) m2); };
}
```

Given that, would it be OK to submit with the extra test commented out and a 
TODO to enable it once matrix types are supported as literal type in constexprs?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D72778/new/

https://reviews.llvm.org/D72778



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to