blob: ed393420eaf3b10d95fa52815fa1f27afc0dd18d [file] [edit]
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++17 -ast-dump %s | FileCheck %s
union U {
int a;
float b;
};
void odr_use(U &x, const U &y, U &&z) {
x = y;
x = static_cast<U &&>(z);
}
// The memcpy operands are typed union pointers, converted to void * only by
// the builtin's parameter.
// CHECK: CXXMethodDecl {{.*}} implicit {{.*}}operator= 'U &(const U &)
// CHECK: CompoundStmt
// CHECK: CallExpr
// CHECK: DeclRefExpr {{.*}} '__builtin_memcpy'
// CHECK: ImplicitCastExpr {{.*}} 'void *' <BitCast>
// CHECK: UnaryOperator {{.*}} 'U *' prefix '&'
// CHECK: ImplicitCastExpr {{.*}} 'const void *' <BitCast>
// CHECK: UnaryOperator {{.*}} 'const U *' prefix '&'
// CHECK: ReturnStmt
// CHECK: CXXMethodDecl {{.*}} implicit {{.*}}operator= 'U &(U &&)
// CHECK: CompoundStmt
// CHECK: CallExpr
// CHECK: DeclRefExpr {{.*}} '__builtin_memcpy'
// CHECK: ImplicitCastExpr {{.*}} 'void *' <BitCast>
// CHECK: UnaryOperator {{.*}} 'U *' prefix '&'
// CHECK: ImplicitCastExpr {{.*}} 'const void *' <BitCast>
// CHECK: UnaryOperator {{.*}} 'U *' prefix '&'
// CHECK: ReturnStmt