philnik777 wrote:

> This doesn't leave us with good options, does it? :-(

Not really. Zero-sized arrays should probably have been supported by C++ all 
along, but it's too late to change it now.

> I think we need to consider the following things:
> 
>     * Should `Ty[0]` and `Ty[]` be handled the same way? (Remember, we 
> support `[0]` in structures as a sort of flexible array member and we support 
> flexible array members in C++ as an extension.)

I'm not sure what you're referring to. AFAICT `T[]` at the end of a struct 
denotes a flexible array member, but `T[0]` doesn't. Or does it?

>     * We should probably change the value of `__is_bounded_array` at the same 
> time as `__is_array`.

Yes. I'll update the PR accordingly.

>     * What should the behavior of `__is_aggregate` be?

I guess it should be true? I can't think of any case where a zero-sized array 
would be different from a non-zero-sized one at least. I don't have a strong 
opinion either way though.

>     * What about other type traits (`__is_compound`, `__is_abstract`, etc)? 
> Basically, what's the principle we're using for this type?

Maybe we could think of it as array-like? i.e. it has the same traits as an 
array except that it's not one. I think the semantics only really break down 
for array-specific features. Just to get a sense, I've gone through a few 
traits:
- `is_compound`: it seems pretty clear to me that it is a compound type, since 
`T[0]` is a distinct type from `T`, but contains a type `T` in its definition.
- `is_class`: It seems pretty clear to me that it's not a class. I don't think 
anybody would disagree here.
- `is_abstract`: You can define a variable of it, so it's not. It's also not a 
class type.
- `is_object`: I think it is, but this could be argued either way. The best 
thing I could come up with is that it's closer to an array than it is to a 
function or reference type.

`is_empty` seems like an interesting case. It's the smallest type there is, 
with `sizeof(int[0]) == 0`, but it's not considered empty by any 
implementation. MSVC rejects the `sizeof` call though. I think it shouldn't be 
considered empty though, since `is_empty` kind-of implies that the type is a 
class type.

> 
> > > > We don't use the trait currently in libc++ because of this bug and GCC 
> > > > only added it in trunk (and have the same bug), so probably not.
> > > 
> > > 
> > > For example, it seems to be used in Unreal Engine: 
> > > https://github.com/windystrife/UnrealEngine_NVIDIAGameWorks/blob/b50e6338a7c5b26374d66306ebc7807541ff815e/Engine/Source/Runtime/Core/Public/Templates/UnrealTemplate.h#L128
> > 
> > 
> > If you think it's a significant enough change that we should add an ABI tag 
> > I can do that.
> 
> I don't have a good feeling one way or the other yet, so let's hold off for 
> the moment and see what the final scope of the changes are before making a 
> decision.

Sounds good.

https://github.com/llvm/llvm-project/pull/86652
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to