https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106613
Bug ID: 106613
Summary: GCC rejects valid program involving std::invariant
saying incomplete type
Product: gcc
Version: 12.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: jlame646 at gmail dot com
Target Milestone: ---
The following valid(afaik) program is rejected by gcc.
https://godbolt.org/z/e73Yf4s47
```
#include <variant>
struct LiteralExpr
{
int value;
};
template <typename T>
struct BaseSpace
{
struct AddExpr;
struct AddExprBox
{
const AddExpr &_impl;
public:
AddExprBox(const AddExpr &obj) {}
};
using Expr = std::variant<AddExprBox, LiteralExpr>;
struct AddExpr
{
std::variant<AddExprBox, LiteralExpr> lhs; // error:
'BaseSpace<T>::AddExpr::lhs' has incomplete type
};
};
auto main() -> int
{
auto expr = BaseSpace<int>::Expr(LiteralExpr{2});
}
```
The error says:
```
error: 'BaseSpace<T>::AddExpr::lhs' has incomplete type
22 | std::variant<AddExprBox, LiteralExpr> lhs;
| ^~~
In file included from <source>:1:
/opt/compiler-explorer/gcc-12.1.0/include/c++/12.1.0/variant:1336:11: note:
declaration of 'class std::variant<BaseSpace<int>::AddExprBox, LiteralExpr>'
1336 | class variant
| ^~~~~~~
```