[llvm-branch-commits] [flang][runtime] Added custom visitor for IoStatementState variants. (PR #85179)

Slava Zakharin via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Mar 14 16:47:08 PDT 2024


vzakhari wrote:

> It would be better to have the types that are available on the device declare themselves so in their declarations via a member or (better) inherited trait.

Like this. I will add the type trait for those types that are available on the device.

> The big variant union in `IoStatementState` could omit the host-only options when compiled for the device.

I am not sure what you are suggesting.  I cannot comment out (e.g. with `RT_DEVICE_OUTPUT` check) the members of `std::variant<...> u_` union, because this will require commenting out all class declarations that try to explicitly access/emplace an instance of the commented out class into the union member. For example,
```
class NoUnitIoStatementState : public IoStatementBase {
...
  template <typename A>
  NoUnitIoStatementState(A &stmt, const char *sourceFile = nullptr,
      int sourceLine = 0, int badUnitNumber = -1)
      : IoStatementBase{sourceFile, sourceLine}, ioStatementState_{stmt},
        badUnitNumber_{badUnitNumber} {}
...
};

class NoopStatementState : public NoUnitIoStatementState {
public:
  NoopStatementState(
      const char *sourceFile = nullptr, int sourceLine = 0, int unitNumber = -1)
      : NoUnitIoStatementState{*this, sourceFile, sourceLine, unitNumber} {}
...
};
```

`ioStatementState_{stmt}` is invalid if the union does not have `NoUnitIoStatementState` variant. There are more examples like this, and there is a lot of code that will need to be commented out for the device compilation if I modify the union declaration.  Maybe I misunderstood your comment, though.

https://github.com/llvm/llvm-project/pull/85179


More information about the llvm-branch-commits mailing list