// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s struct non_trivial { non_trivial(); non_trivial(const non_trivial&); non_trivial& operator = (const non_trivial&); ~non_trivial(); }; union u { non_trivial nt; }; union u2 { non_trivial nt; int k; u2(int k) : k(k) {} u2() : nt() {} }; union static_data_member { static int i; }; int static_data_member::i; union bad { int &i; // expected-error {{union member 'i' has reference type 'int &'}} }; struct s { union { non_trivial nt; }; }; // Don't crash on this. struct TemplateCtor { template TemplateCtor(T); }; union TemplateCtorMember { TemplateCtor s; }; template struct remove_ref { typedef T type; }; template struct remove_ref { typedef T type; }; template struct remove_ref { typedef T type; }; template T &&forward(typename remove_ref::type &&t); template T &&forward(typename remove_ref::type &t); template typename remove_ref::type &&move(T &&t); using size_t = decltype(sizeof(int)); void *operator new(size_t, void *p) noexcept { return p; } namespace disabled_dtor { template union disable_dtor { T val; template disable_dtor(U &&...u) : val(forward(u)...) {} ~disable_dtor() {} }; struct deleted_dtor { deleted_dtor(int n, char c) : n(n), c(c) {} int n; char c; ~deleted_dtor() = delete; }; disable_dtor dd(4, 'x'); } namespace optional { template struct optional { bool has; union { T value; }; optional() : has(false) {} template optional(U &&...u) : has(true), value(forward(u)...) {} optional(const optional &o) : has(o.has) { if (has) new (&value) T(o.value); } optional(optional &&o) : has(o.has) { if (has) new (&value) T(move(o.value)); } optional &operator=(const optional &o) { if (has) { if (o.has) value = o.value; else value.~T(); } else if (o.has) { new (&value) T(o.value); } has = o.has; } optional &operator=(optional &&o) { if (has) { if (o.has) value = move(o.value); else value.~T(); } else if (o.has) { new (&value) T(move(o.value)); } has = o.has; } ~optional() { if (has) value.~T(); } explicit operator bool() const { return has; } T &operator*() const { return value; } }; optional o1; optional o2{non_trivial()}; optional o3{*o2}; void f() { if (o2) o1 = o2; o2 = optional(); } } namespace pr16061 { struct X { X(); }; template struct Test1 { union { struct { X x; }; }; }; template struct Test2 { union { struct { // expected-note {{default constructor of 'Test2' is implicitly deleted because variant field '' has a non-trivial default constructor}} T x; }; }; }; Test2 t2x; // expected-error {{call to implicitly-deleted default constructor of 'Test2'}} }