dblaikie added a comment.

Each godbolt link shows  MSVC 19.latest and clang, both in x86 and aarch64, 
with a reference pod and non-pod example at the start and end, and the variable 
test in the middle to see whether the codegen matches the pod or non-pod 
baselines above and below.

> 1. checked (second): has base classes

https://godbolt.org/z/d76fEGP1M - all agreed

> 2. checked (third): virtual functions/polymorphic

Oh, I guess if you can't have base classes then testing 'is polymorphic' is 
equivalent to 'has virtual functions'

This one's slightly less obvious to verify due to the existence of a virtual 
function changing the codegen of the `f1` test functions so comparing it to the 
pod/non-pod reference  & maybe me think about how to better isolate the test - 
though I don't think it's possible to totally isolate it, adding a virtual 
functions adds a vptr that has to be copied ,etc and extra globals for the 
vtalbe itself (MSVC doesn't home vtables), etc.

So I've got this: https://godbolt.org/z/nGa4drG4h - but it looks like they all 
agree, despite the extra variations in the output

> 3. only user-provided ctors, so it can have non-implicit (user-declared) but 
> defaulted ctors

User-defined ctor (`t1(int)` unrelated to any usage/copy operation, etc): 
https://godbolt.org/z/e79b1zeqr - everyone agrees
User-declared-but-not-user-defined ctor (`t1() = default`): Clang x86 is 
incorrect, believes it to be non-trivial - that's the original issue under 
discussion in this bug

> 4. specifically checking non-trivial copy assignment (no restriction on move 
> assignment and it could have any number of other member functions, I think?)

Oh, everyone allows a non-trivial non-special member function, I misread the 
Clang code - those don't affect retro-POD either, so everyone agrees on that. 
https://godbolt.org/z/hnMfqjov7

Restricting this to Special Member Functions, defaulted copy constructor... 
https://godbolt.org/z/sGvxcEPjo Clang x86 is incorrect

> 5. checked (first)

Used this as the baseline - everyone agrees.

> 6. nope/not relevant?



-

> 7. Presumably tested by "hasNonTrivialDestructor" and 
> "hasNonTrivialCopyAssignment"?

Having a field of a type with a protected member (property 5) - Clang x86 is 
incorrect: https://godbolt.org/z/GY48qxh3G
Having a field of a type with a non-trivial dtor - everyone agrees: 
https://godbolt.org/z/4dq9b43ac
Having a field of a type with a non-trivial copy-assignment - everyone agrees: 
https://godbolt.org/z/WEnKcz7oW

> 8. would a non-static data member initializer make the ctor user-provided? 
> Presumably not, so I don't think this property is checked at all, which seems 
> fair - how you pass something shouldn't be changed by how its constructed

Non-static data member initializer: https://godbolt.org/z/Mb1PYhjrP - Clang x86 
is incorrect

So... my conclusion is that Clang's AArch64 appears to be correct for x86  as 
well, and we should just rename the function and use it unconditionally, 
removing any use of Clang's AST POD property in the MSVC ABI handling?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D119051

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

Reply via email to