| // RUN: %clang_cc1 -triple x86_64-linux-pc -DIS64 -fsyntax-only -verify -std=c++17 %s |
| // RUN: %clang_cc1 -triple x86_64-windows-pc -DIS64 -fsyntax-only -verify -std=c++17 %s |
| // RUN: %clang_cc1 -triple i386-linux-pc -fsyntax-only -verify -std=c++17 %s |
| // RUN: %clang_cc1 -triple i386-windows-pc -DW32 -fsyntax-only -verify -std=c++17 %s |
| // expected-no-diagnostics |
| |
| struct Base {}; |
| struct A : virtual Base { |
| virtual void n() {} |
| }; |
| |
| auto p = &A::n; |
| static_assert(__has_unique_object_representations(decltype(p))); |
| |
| struct B { |
| decltype(p) x; |
| int b; |
| #ifdef IS64 |
| // required on 64 bit to fill out the tail padding. |
| int c; |
| #endif |
| }; |
| static_assert(__has_unique_object_representations(B)); |
| |
| struct C { // has padding on Win32, but nothing else. |
| decltype(p) x; |
| }; |
| #ifdef W32 |
| static_assert(!__has_unique_object_representations(C)); |
| #else |
| static_assert(__has_unique_object_representations(C)); |
| #endif |