non-trivial C union types This recommits r365985, which was reverted because it broke a few projects using unions containing non-trivial ObjC pointer fields in system headers. We now have a patch to fix the problem (see https://reviews.llvm.org/D65256). Original commit message: This patch diagnoses uses of non-trivial C unions and structs/unions containing non-trivial C unions in the following contexts, which require default-initialization, destruction, or copying of the union objects, instead of disallowing fields of non-trivial types in C unions, which is what we currently do: - function parameters. - function returns. - assignments. - compound literals. - block captures except capturing of `__block` variables by non-escaping blocks. - local and global variable definitions. - lvalue-to-rvalue conversions of volatile types. See the discussion in https://reviews.llvm.org/D62988 for more background. rdar://problem/50679094 Differential Revision: https://reviews.llvm.org/D63753 llvm-svn: 371275
25 lines
1.1 KiB
Objective-C
25 lines
1.1 KiB
Objective-C
// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -emit-pch -o %t.pch %s
|
|
// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -include-pch %t.pch -verify %s
|
|
|
|
#ifndef HEADER
|
|
#define HEADER
|
|
|
|
typedef union {
|
|
id f0;
|
|
} U0;
|
|
|
|
#else
|
|
|
|
// expected-note@-6 {{'U0' has subobjects that are non-trivial to destruct}}
|
|
// expected-note@-7 {{'U0' has subobjects that are non-trivial to copy}}
|
|
// expected-note@-8 {{'U0' has subobjects that are non-trivial to default-initialize}}
|
|
// expected-note@-8 {{f0 has type '__strong id' that is non-trivial to destruct}}
|
|
// expected-note@-9 {{f0 has type '__strong id' that is non-trivial to copy}}
|
|
// expected-note@-10 {{f0 has type '__strong id' that is non-trivial to default-initialize}}
|
|
|
|
U0 foo0(void); // expected-error {{cannot use type 'U0' for function/method return since it is a union that is non-trivial to destruct}} expected-error {{cannot use type 'U0' for function/method return since it is a union that is non-trivial to copy}}
|
|
|
|
U0 g0; // expected-error {{cannot default-initialize an object of type 'U0' since it is a union that is non-trivial to default-initialize}}
|
|
|
|
#endif
|