#define MOZ_NON_MEMMOVABLE __attribute__((annotate("moz_non_memmovable"))) #define MOZ_NEEDS_MEMMOVABLE_TYPE __attribute__((annotate("moz_needs_memmovable_type"))) #define MOZ_NEEDS_MEMMOVABLE_MEMBERS __attribute__((annotate("moz_needs_memmovable_members"))) /* These are a bunch of structs with variable levels of memmovability. They will be used as template parameters to the various NeedyTemplates */ struct MOZ_NON_MEMMOVABLE NonMovable {}; struct Movable {}; // Subclasses struct S_NonMovable : NonMovable {}; // expected-note 51 {{'S_NonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'NonMovable'}} struct S_Movable : Movable {}; // Members struct W_NonMovable { NonMovable m; // expected-note 34 {{'W_NonMovable' is a non-memmove()able type because member 'm' is a non-memmove()able type 'NonMovable'}} }; struct W_Movable { Movable m; }; // Wrapped Subclasses struct WS_NonMovable { S_NonMovable m; // expected-note 34 {{'WS_NonMovable' is a non-memmove()able type because member 'm' is a non-memmove()able type 'S_NonMovable'}} }; struct WS_Movable { S_Movable m; }; // Combinations of the above struct SW_NonMovable : W_NonMovable {}; // expected-note 17 {{'SW_NonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'W_NonMovable'}} struct SW_Movable : W_Movable {}; struct SWS_NonMovable : WS_NonMovable {}; // expected-note 17 {{'SWS_NonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'WS_NonMovable'}} struct SWS_Movable : WS_Movable {}; // Basic templated wrapper template struct Template_Inline { T m; // expected-note-re 56 {{'Template_Inline<{{.*}}>' is a non-memmove()able type because member 'm' is a non-memmove()able type '{{.*}}'}} }; template struct Template_Ref { T* m; }; template struct Template_Unused {}; template struct MOZ_NON_MEMMOVABLE Template_NonMovable {}; /* These tests take the following form: DECLARATIONS => Declarations of the templates which are either marked with MOZ_NEEDS_MEMMOVABLE_TYPE or which instantiate a MOZ_NEEDS_MEMMOVABLE_TYPE through some mechanism. BAD N => Instantiations of the wrapper template with each of the non-memmovable types. The prefix S_ means subclass, W_ means wrapped. Each of these rows should produce an error on the NeedyTemplate in question, and a note at the instantiation location of that template. Unfortunately, on every case more complicated than bad1, the instantiation location is within another template. Thus, the notes are expected on the template in question which actually instantiates the MOZ_NEEDS_MEMMOVABLE_TYPE template. GOOD N => Instantiations of the wrapper template with each of the memmovable types. This is meant as a sanity check to ensure that we don't reject valid instantiations of templates. Note 1: Each set uses it's own types to ensure that they don't re-use each-other's template specializations. If they did, then some of the error messages would not be emitted (as error messages are emitted for template specializations, rather than for variable declarations) Note 2: Every instance of NeedyTemplate contains a member of type T. This is to ensure that T is actually instantiated (if T is a template) by clang. If T isn't instantiated, then we can't actually tell if it is NON_MEMMOVABLE. (This is OK in practice, as you cannot memmove a type which you don't know the size of). Note 3: There are a set of tests for specializations of NeedyTemplate at the bottom. For each set of tests, these tests contribute two expected errors to the templates. */ // // 1 - Unwrapped MOZ_NEEDS_MEMMOVABLE_TYPE // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate1 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate1<{{.*}}>' with non-memmovable template argument '{{.*}}'}} void bad1() { NeedyTemplate1 a1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 a2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 a3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 a4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 a5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 a6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > b1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > b2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > b3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > b4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > b5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > b6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c7; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c8; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c9; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c10; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c11; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} NeedyTemplate1 > c12; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} } void good1() { NeedyTemplate1 a1; NeedyTemplate1 a2; NeedyTemplate1 a3; NeedyTemplate1 a4; NeedyTemplate1 a5; NeedyTemplate1 a6; NeedyTemplate1 > b1; NeedyTemplate1 > b2; NeedyTemplate1 > b3; NeedyTemplate1 > b4; NeedyTemplate1 > b5; NeedyTemplate1 > b6; NeedyTemplate1 > c1; NeedyTemplate1 > c2; NeedyTemplate1 > c3; NeedyTemplate1 > c4; NeedyTemplate1 > c5; NeedyTemplate1 > c6; NeedyTemplate1 > c7; NeedyTemplate1 > c8; NeedyTemplate1 > c9; NeedyTemplate1 > c10; NeedyTemplate1 > c11; NeedyTemplate1 > c12; NeedyTemplate1 > d1; NeedyTemplate1 > d2; NeedyTemplate1 > d3; NeedyTemplate1 > d4; NeedyTemplate1 > d5; NeedyTemplate1 > d6; NeedyTemplate1 > d7; NeedyTemplate1 > d8; NeedyTemplate1 > d9; NeedyTemplate1 > d10; NeedyTemplate1 > d11; NeedyTemplate1 > d12; } // // 2 - Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate2 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate2<{{.*}}>' with non-memmovable template argument '{{.*}}'}} template struct S_NeedyTemplate2 : NeedyTemplate2 {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate2<{{.*}}>' requested here}} void bad2() { S_NeedyTemplate2 a1; S_NeedyTemplate2 a2; S_NeedyTemplate2 a3; S_NeedyTemplate2 a4; S_NeedyTemplate2 a5; S_NeedyTemplate2 a6; S_NeedyTemplate2 > b1; S_NeedyTemplate2 > b2; S_NeedyTemplate2 > b3; S_NeedyTemplate2 > b4; S_NeedyTemplate2 > b5; S_NeedyTemplate2 > b6; S_NeedyTemplate2 > c1; S_NeedyTemplate2 > c2; S_NeedyTemplate2 > c3; S_NeedyTemplate2 > c4; S_NeedyTemplate2 > c5; S_NeedyTemplate2 > c6; S_NeedyTemplate2 > c7; S_NeedyTemplate2 > c8; S_NeedyTemplate2 > c9; S_NeedyTemplate2 > c10; S_NeedyTemplate2 > c11; S_NeedyTemplate2 > c12; } void good2() { S_NeedyTemplate2 a1; S_NeedyTemplate2 a2; S_NeedyTemplate2 a3; S_NeedyTemplate2 a4; S_NeedyTemplate2 a5; S_NeedyTemplate2 a6; S_NeedyTemplate2 > b1; S_NeedyTemplate2 > b2; S_NeedyTemplate2 > b3; S_NeedyTemplate2 > b4; S_NeedyTemplate2 > b5; S_NeedyTemplate2 > b6; S_NeedyTemplate2 > c1; S_NeedyTemplate2 > c2; S_NeedyTemplate2 > c3; S_NeedyTemplate2 > c4; S_NeedyTemplate2 > c5; S_NeedyTemplate2 > c6; S_NeedyTemplate2 > c7; S_NeedyTemplate2 > c8; S_NeedyTemplate2 > c9; S_NeedyTemplate2 > c10; S_NeedyTemplate2 > c11; S_NeedyTemplate2 > c12; S_NeedyTemplate2 > d1; S_NeedyTemplate2 > d2; S_NeedyTemplate2 > d3; S_NeedyTemplate2 > d4; S_NeedyTemplate2 > d5; S_NeedyTemplate2 > d6; S_NeedyTemplate2 > d7; S_NeedyTemplate2 > d8; S_NeedyTemplate2 > d9; S_NeedyTemplate2 > d10; S_NeedyTemplate2 > d11; S_NeedyTemplate2 > d12; } // // 3 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate3 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate3<{{.*}}>' with non-memmovable template argument '{{.*}}'}} template struct W_NeedyTemplate3 { NeedyTemplate3 m; // expected-note-re 26 {{instantiation of 'NeedyTemplate3<{{.*}}>' requested here}} }; void bad3() { W_NeedyTemplate3 a1; W_NeedyTemplate3 a2; W_NeedyTemplate3 a3; W_NeedyTemplate3 a4; W_NeedyTemplate3 a5; W_NeedyTemplate3 a6; W_NeedyTemplate3 > b1; W_NeedyTemplate3 > b2; W_NeedyTemplate3 > b3; W_NeedyTemplate3 > b4; W_NeedyTemplate3 > b5; W_NeedyTemplate3 > b6; W_NeedyTemplate3 > c1; W_NeedyTemplate3 > c2; W_NeedyTemplate3 > c3; W_NeedyTemplate3 > c4; W_NeedyTemplate3 > c5; W_NeedyTemplate3 > c6; W_NeedyTemplate3 > c7; W_NeedyTemplate3 > c8; W_NeedyTemplate3 > c9; W_NeedyTemplate3 > c10; W_NeedyTemplate3 > c11; W_NeedyTemplate3 > c12; } void good3() { W_NeedyTemplate3 a1; W_NeedyTemplate3 a2; W_NeedyTemplate3 a3; W_NeedyTemplate3 a4; W_NeedyTemplate3 a5; W_NeedyTemplate3 a6; W_NeedyTemplate3 > b1; W_NeedyTemplate3 > b2; W_NeedyTemplate3 > b3; W_NeedyTemplate3 > b4; W_NeedyTemplate3 > b5; W_NeedyTemplate3 > b6; W_NeedyTemplate3 > c1; W_NeedyTemplate3 > c2; W_NeedyTemplate3 > c3; W_NeedyTemplate3 > c4; W_NeedyTemplate3 > c5; W_NeedyTemplate3 > c6; W_NeedyTemplate3 > c7; W_NeedyTemplate3 > c8; W_NeedyTemplate3 > c9; W_NeedyTemplate3 > c10; W_NeedyTemplate3 > c11; W_NeedyTemplate3 > c12; W_NeedyTemplate3 > d1; W_NeedyTemplate3 > d2; W_NeedyTemplate3 > d3; W_NeedyTemplate3 > d4; W_NeedyTemplate3 > d5; W_NeedyTemplate3 > d6; W_NeedyTemplate3 > d7; W_NeedyTemplate3 > d8; W_NeedyTemplate3 > d9; W_NeedyTemplate3 > d10; W_NeedyTemplate3 > d11; W_NeedyTemplate3 > d12; } // // 4 - Wrapped Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate4 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate4<{{.*}}>' with non-memmovable template argument '{{.*}}'}} template struct S_NeedyTemplate4 : NeedyTemplate4 {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate4<{{.*}}>' requested here}} template struct WS_NeedyTemplate4 { S_NeedyTemplate4 m; }; void bad4() { WS_NeedyTemplate4 a1; WS_NeedyTemplate4 a2; WS_NeedyTemplate4 a3; WS_NeedyTemplate4 a4; WS_NeedyTemplate4 a5; WS_NeedyTemplate4 a6; WS_NeedyTemplate4 > b1; WS_NeedyTemplate4 > b2; WS_NeedyTemplate4 > b3; WS_NeedyTemplate4 > b4; WS_NeedyTemplate4 > b5; WS_NeedyTemplate4 > b6; WS_NeedyTemplate4 > c1; WS_NeedyTemplate4 > c2; WS_NeedyTemplate4 > c3; WS_NeedyTemplate4 > c4; WS_NeedyTemplate4 > c5; WS_NeedyTemplate4 > c6; WS_NeedyTemplate4 > c7; WS_NeedyTemplate4 > c8; WS_NeedyTemplate4 > c9; WS_NeedyTemplate4 > c10; WS_NeedyTemplate4 > c11; WS_NeedyTemplate4 > c12; } void good4() { WS_NeedyTemplate4 a1; WS_NeedyTemplate4 a2; WS_NeedyTemplate4 a3; WS_NeedyTemplate4 a4; WS_NeedyTemplate4 a5; WS_NeedyTemplate4 a6; WS_NeedyTemplate4 > b1; WS_NeedyTemplate4 > b2; WS_NeedyTemplate4 > b3; WS_NeedyTemplate4 > b4; WS_NeedyTemplate4 > b5; WS_NeedyTemplate4 > b6; WS_NeedyTemplate4 > c1; WS_NeedyTemplate4 > c2; WS_NeedyTemplate4 > c3; WS_NeedyTemplate4 > c4; WS_NeedyTemplate4 > c5; WS_NeedyTemplate4 > c6; WS_NeedyTemplate4 > c7; WS_NeedyTemplate4 > c8; WS_NeedyTemplate4 > c9; WS_NeedyTemplate4 > c10; WS_NeedyTemplate4 > c11; WS_NeedyTemplate4 > c12; WS_NeedyTemplate4 > d1; WS_NeedyTemplate4 > d2; WS_NeedyTemplate4 > d3; WS_NeedyTemplate4 > d4; WS_NeedyTemplate4 > d5; WS_NeedyTemplate4 > d6; WS_NeedyTemplate4 > d7; WS_NeedyTemplate4 > d8; WS_NeedyTemplate4 > d9; WS_NeedyTemplate4 > d10; WS_NeedyTemplate4 > d11; WS_NeedyTemplate4 > d12; } // // 5 - Subclassed Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate5 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate5<{{.*}}>' with non-memmovable template argument '{{.*}}'}} template struct W_NeedyTemplate5 { NeedyTemplate5 m; // expected-note-re 26 {{instantiation of 'NeedyTemplate5<{{.*}}>' requested here}} }; template struct SW_NeedyTemplate5 : W_NeedyTemplate5 {}; void bad5() { SW_NeedyTemplate5 a1; SW_NeedyTemplate5 a2; SW_NeedyTemplate5 a3; SW_NeedyTemplate5 a4; SW_NeedyTemplate5 a5; SW_NeedyTemplate5 a6; SW_NeedyTemplate5 > b1; SW_NeedyTemplate5 > b2; SW_NeedyTemplate5 > b3; SW_NeedyTemplate5 > b4; SW_NeedyTemplate5 > b5; SW_NeedyTemplate5 > b6; SW_NeedyTemplate5 > c1; SW_NeedyTemplate5 > c2; SW_NeedyTemplate5 > c3; SW_NeedyTemplate5 > c4; SW_NeedyTemplate5 > c5; SW_NeedyTemplate5 > c6; SW_NeedyTemplate5 > c7; SW_NeedyTemplate5 > c8; SW_NeedyTemplate5 > c9; SW_NeedyTemplate5 > c10; SW_NeedyTemplate5 > c11; SW_NeedyTemplate5 > c12; } void good5() { SW_NeedyTemplate5 a1; SW_NeedyTemplate5 a2; SW_NeedyTemplate5 a3; SW_NeedyTemplate5 a4; SW_NeedyTemplate5 a5; SW_NeedyTemplate5 a6; SW_NeedyTemplate5 > b1; SW_NeedyTemplate5 > b2; SW_NeedyTemplate5 > b3; SW_NeedyTemplate5 > b4; SW_NeedyTemplate5 > b5; SW_NeedyTemplate5 > b6; SW_NeedyTemplate5 > c1; SW_NeedyTemplate5 > c2; SW_NeedyTemplate5 > c3; SW_NeedyTemplate5 > c4; SW_NeedyTemplate5 > c5; SW_NeedyTemplate5 > c6; SW_NeedyTemplate5 > c7; SW_NeedyTemplate5 > c8; SW_NeedyTemplate5 > c9; SW_NeedyTemplate5 > c10; SW_NeedyTemplate5 > c11; SW_NeedyTemplate5 > c12; SW_NeedyTemplate5 > d1; SW_NeedyTemplate5 > d2; SW_NeedyTemplate5 > d3; SW_NeedyTemplate5 > d4; SW_NeedyTemplate5 > d5; SW_NeedyTemplate5 > d6; SW_NeedyTemplate5 > d7; SW_NeedyTemplate5 > d8; SW_NeedyTemplate5 > d9; SW_NeedyTemplate5 > d10; SW_NeedyTemplate5 > d11; SW_NeedyTemplate5 > d12; } // // 6 - MOZ_NEEDS_MEMMOVABLE_TYPE instantiated with default template argument // // Note: This has an extra error, because it also includes a test with the default template argument. // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate6 {T m;}; // expected-error-re 27 {{Cannot instantiate 'NeedyTemplate6<{{.*}}>' with non-memmovable template argument '{{.*}}'}} template struct W_NeedyTemplate6 { NeedyTemplate6 m; // expected-note-re 27 {{instantiation of 'NeedyTemplate6<{{.*}}>' requested here}} }; template struct SW_NeedyTemplate6 : W_NeedyTemplate6 {}; // We create a different NonMovable type here, as NeedyTemplate6 will already be instantiated with NonMovable struct MOZ_NON_MEMMOVABLE NonMovable2 {}; template struct Defaulted_SW_NeedyTemplate6 { SW_NeedyTemplate6 m; }; void bad6() { Defaulted_SW_NeedyTemplate6 a1; Defaulted_SW_NeedyTemplate6 a2; Defaulted_SW_NeedyTemplate6 a3; Defaulted_SW_NeedyTemplate6 a4; Defaulted_SW_NeedyTemplate6 a5; Defaulted_SW_NeedyTemplate6 a6; Defaulted_SW_NeedyTemplate6 > b1; Defaulted_SW_NeedyTemplate6 > b2; Defaulted_SW_NeedyTemplate6 > b3; Defaulted_SW_NeedyTemplate6 > b4; Defaulted_SW_NeedyTemplate6 > b5; Defaulted_SW_NeedyTemplate6 > b6; Defaulted_SW_NeedyTemplate6 > c1; Defaulted_SW_NeedyTemplate6 > c2; Defaulted_SW_NeedyTemplate6 > c3; Defaulted_SW_NeedyTemplate6 > c4; Defaulted_SW_NeedyTemplate6 > c5; Defaulted_SW_NeedyTemplate6 > c6; Defaulted_SW_NeedyTemplate6 > c7; Defaulted_SW_NeedyTemplate6 > c8; Defaulted_SW_NeedyTemplate6 > c9; Defaulted_SW_NeedyTemplate6 > c10; Defaulted_SW_NeedyTemplate6 > c11; Defaulted_SW_NeedyTemplate6 > c12; Defaulted_SW_NeedyTemplate6<> c13; } void good6() { Defaulted_SW_NeedyTemplate6 a1; Defaulted_SW_NeedyTemplate6 a2; Defaulted_SW_NeedyTemplate6 a3; Defaulted_SW_NeedyTemplate6 a4; Defaulted_SW_NeedyTemplate6 a5; Defaulted_SW_NeedyTemplate6 a6; Defaulted_SW_NeedyTemplate6 > b1; Defaulted_SW_NeedyTemplate6 > b2; Defaulted_SW_NeedyTemplate6 > b3; Defaulted_SW_NeedyTemplate6 > b4; Defaulted_SW_NeedyTemplate6 > b5; Defaulted_SW_NeedyTemplate6 > b6; Defaulted_SW_NeedyTemplate6 > c1; Defaulted_SW_NeedyTemplate6 > c2; Defaulted_SW_NeedyTemplate6 > c3; Defaulted_SW_NeedyTemplate6 > c4; Defaulted_SW_NeedyTemplate6 > c5; Defaulted_SW_NeedyTemplate6 > c6; Defaulted_SW_NeedyTemplate6 > c7; Defaulted_SW_NeedyTemplate6 > c8; Defaulted_SW_NeedyTemplate6 > c9; Defaulted_SW_NeedyTemplate6 > c10; Defaulted_SW_NeedyTemplate6 > c11; Defaulted_SW_NeedyTemplate6 > c12; Defaulted_SW_NeedyTemplate6 > d1; Defaulted_SW_NeedyTemplate6 > d2; Defaulted_SW_NeedyTemplate6 > d3; Defaulted_SW_NeedyTemplate6 > d4; Defaulted_SW_NeedyTemplate6 > d5; Defaulted_SW_NeedyTemplate6 > d6; Defaulted_SW_NeedyTemplate6 > d7; Defaulted_SW_NeedyTemplate6 > d8; Defaulted_SW_NeedyTemplate6 > d9; Defaulted_SW_NeedyTemplate6 > d10; Defaulted_SW_NeedyTemplate6 > d11; Defaulted_SW_NeedyTemplate6 > d12; } // // 7 - MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate7 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate7<{{.*}}>' with non-memmovable template argument '{{.*}}'}} template > struct Defaulted_Templated_NeedyTemplate7 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate7<{{.*}}>' requested here}} void bad7() { Defaulted_Templated_NeedyTemplate7 a1; Defaulted_Templated_NeedyTemplate7 a2; Defaulted_Templated_NeedyTemplate7 a3; Defaulted_Templated_NeedyTemplate7 a4; Defaulted_Templated_NeedyTemplate7 a5; Defaulted_Templated_NeedyTemplate7 a6; Defaulted_Templated_NeedyTemplate7 > b1; Defaulted_Templated_NeedyTemplate7 > b2; Defaulted_Templated_NeedyTemplate7 > b3; Defaulted_Templated_NeedyTemplate7 > b4; Defaulted_Templated_NeedyTemplate7 > b5; Defaulted_Templated_NeedyTemplate7 > b6; Defaulted_Templated_NeedyTemplate7 > c1; Defaulted_Templated_NeedyTemplate7 > c2; Defaulted_Templated_NeedyTemplate7 > c3; Defaulted_Templated_NeedyTemplate7 > c4; Defaulted_Templated_NeedyTemplate7 > c5; Defaulted_Templated_NeedyTemplate7 > c6; Defaulted_Templated_NeedyTemplate7 > c7; Defaulted_Templated_NeedyTemplate7 > c8; Defaulted_Templated_NeedyTemplate7 > c9; Defaulted_Templated_NeedyTemplate7 > c10; Defaulted_Templated_NeedyTemplate7 > c11; Defaulted_Templated_NeedyTemplate7 > c12; } void good7() { Defaulted_Templated_NeedyTemplate7 a1; Defaulted_Templated_NeedyTemplate7 a2; Defaulted_Templated_NeedyTemplate7 a3; Defaulted_Templated_NeedyTemplate7 a4; Defaulted_Templated_NeedyTemplate7 a5; Defaulted_Templated_NeedyTemplate7 a6; Defaulted_Templated_NeedyTemplate7 > b1; Defaulted_Templated_NeedyTemplate7 > b2; Defaulted_Templated_NeedyTemplate7 > b3; Defaulted_Templated_NeedyTemplate7 > b4; Defaulted_Templated_NeedyTemplate7 > b5; Defaulted_Templated_NeedyTemplate7 > b6; Defaulted_Templated_NeedyTemplate7 > c1; Defaulted_Templated_NeedyTemplate7 > c2; Defaulted_Templated_NeedyTemplate7 > c3; Defaulted_Templated_NeedyTemplate7 > c4; Defaulted_Templated_NeedyTemplate7 > c5; Defaulted_Templated_NeedyTemplate7 > c6; Defaulted_Templated_NeedyTemplate7 > c7; Defaulted_Templated_NeedyTemplate7 > c8; Defaulted_Templated_NeedyTemplate7 > c9; Defaulted_Templated_NeedyTemplate7 > c10; Defaulted_Templated_NeedyTemplate7 > c11; Defaulted_Templated_NeedyTemplate7 > c12; Defaulted_Templated_NeedyTemplate7 > d1; Defaulted_Templated_NeedyTemplate7 > d2; Defaulted_Templated_NeedyTemplate7 > d3; Defaulted_Templated_NeedyTemplate7 > d4; Defaulted_Templated_NeedyTemplate7 > d5; Defaulted_Templated_NeedyTemplate7 > d6; Defaulted_Templated_NeedyTemplate7 > d7; Defaulted_Templated_NeedyTemplate7 > d8; Defaulted_Templated_NeedyTemplate7 > d9; Defaulted_Templated_NeedyTemplate7 > d10; Defaulted_Templated_NeedyTemplate7 > d11; Defaulted_Templated_NeedyTemplate7 > d12; } // // 8 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument // template struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate8 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate8<{{.*}}>' with non-memmovable template argument '{{.*}}'}} template > struct Defaulted_Templated_NeedyTemplate8 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate8<{{.*}}>' requested here}} template struct W_Defaulted_Templated_NeedyTemplate8 { Defaulted_Templated_NeedyTemplate8 m; }; void bad8() { W_Defaulted_Templated_NeedyTemplate8 a1; W_Defaulted_Templated_NeedyTemplate8 a2; W_Defaulted_Templated_NeedyTemplate8 a3; W_Defaulted_Templated_NeedyTemplate8 a4; W_Defaulted_Templated_NeedyTemplate8 a5; W_Defaulted_Templated_NeedyTemplate8 a6; W_Defaulted_Templated_NeedyTemplate8 > b1; W_Defaulted_Templated_NeedyTemplate8 > b2; W_Defaulted_Templated_NeedyTemplate8 > b3; W_Defaulted_Templated_NeedyTemplate8 > b4; W_Defaulted_Templated_NeedyTemplate8 > b5; W_Defaulted_Templated_NeedyTemplate8 > b6; W_Defaulted_Templated_NeedyTemplate8 > c1; W_Defaulted_Templated_NeedyTemplate8 > c2; W_Defaulted_Templated_NeedyTemplate8 > c3; W_Defaulted_Templated_NeedyTemplate8 > c4; W_Defaulted_Templated_NeedyTemplate8 > c5; W_Defaulted_Templated_NeedyTemplate8 > c6; W_Defaulted_Templated_NeedyTemplate8 > c7; W_Defaulted_Templated_NeedyTemplate8 > c8; W_Defaulted_Templated_NeedyTemplate8 > c9; W_Defaulted_Templated_NeedyTemplate8 > c10; W_Defaulted_Templated_NeedyTemplate8 > c11; W_Defaulted_Templated_NeedyTemplate8 > c12; } void good8() { W_Defaulted_Templated_NeedyTemplate8 a1; W_Defaulted_Templated_NeedyTemplate8 a2; W_Defaulted_Templated_NeedyTemplate8 a3; W_Defaulted_Templated_NeedyTemplate8 a4; W_Defaulted_Templated_NeedyTemplate8 a5; W_Defaulted_Templated_NeedyTemplate8 a6; W_Defaulted_Templated_NeedyTemplate8 > b1; W_Defaulted_Templated_NeedyTemplate8 > b2; W_Defaulted_Templated_NeedyTemplate8 > b3; W_Defaulted_Templated_NeedyTemplate8 > b4; W_Defaulted_Templated_NeedyTemplate8 > b5; W_Defaulted_Templated_NeedyTemplate8 > b6; W_Defaulted_Templated_NeedyTemplate8 > c1; W_Defaulted_Templated_NeedyTemplate8 > c2; W_Defaulted_Templated_NeedyTemplate8 > c3; W_Defaulted_Templated_NeedyTemplate8 > c4; W_Defaulted_Templated_NeedyTemplate8 > c5; W_Defaulted_Templated_NeedyTemplate8 > c6; W_Defaulted_Templated_NeedyTemplate8 > c7; W_Defaulted_Templated_NeedyTemplate8 > c8; W_Defaulted_Templated_NeedyTemplate8 > c9; W_Defaulted_Templated_NeedyTemplate8 > c10; W_Defaulted_Templated_NeedyTemplate8 > c11; W_Defaulted_Templated_NeedyTemplate8 > c12; W_Defaulted_Templated_NeedyTemplate8 > d1; W_Defaulted_Templated_NeedyTemplate8 > d2; W_Defaulted_Templated_NeedyTemplate8 > d3; W_Defaulted_Templated_NeedyTemplate8 > d4; W_Defaulted_Templated_NeedyTemplate8 > d5; W_Defaulted_Templated_NeedyTemplate8 > d6; W_Defaulted_Templated_NeedyTemplate8 > d7; W_Defaulted_Templated_NeedyTemplate8 > d8; W_Defaulted_Templated_NeedyTemplate8 > d9; W_Defaulted_Templated_NeedyTemplate8 > d10; W_Defaulted_Templated_NeedyTemplate8 > d11; W_Defaulted_Templated_NeedyTemplate8 > d12; } /* SpecializedNonMovable is a non-movable class which has an explicit specialization of NeedyTemplate for it. Instantiations of NeedyTemplateN should be legal as the explicit specialization isn't annotated with MOZ_NEEDS_MEMMOVABLE_TYPE. However, as it is MOZ_NON_MEMMOVABLE, derived classes and members shouldn't be able to be used to instantiate NeedyTemplate. */ struct MOZ_NON_MEMMOVABLE SpecializedNonMovable {}; struct S_SpecializedNonMovable : SpecializedNonMovable {}; // expected-note 8 {{'S_SpecializedNonMovable' is a non-memmove()able type because it inherits from a non-memmove()able type 'SpecializedNonMovable'}} // Specialize all of the NeedyTemplates with SpecializedNonMovable. template <> struct NeedyTemplate1 {}; template <> struct NeedyTemplate2 {}; template <> struct NeedyTemplate3 {}; template <> struct NeedyTemplate4 {}; template <> struct NeedyTemplate5 {}; template <> struct NeedyTemplate6 {}; template <> struct NeedyTemplate7 {}; template <> struct NeedyTemplate8 {}; void specialization() { /* SpecializedNonMovable has a specialization for every variant of NeedyTemplate, so these templates are valid, even though SpecializedNonMovable isn't memmovable */ NeedyTemplate1 a1; S_NeedyTemplate2 a2; W_NeedyTemplate3 a3; WS_NeedyTemplate4 a4; SW_NeedyTemplate5 a5; Defaulted_SW_NeedyTemplate6 a6; Defaulted_Templated_NeedyTemplate7 a7; W_Defaulted_Templated_NeedyTemplate8 a8; /* These entries contain an element which is SpecializedNonMovable, and are non-movable as there is no valid specialization, and their member is non-memmovable */ NeedyTemplate1 > b1; // expected-note-re {{instantiation of 'NeedyTemplate1{{ ?}}>' requested here}} S_NeedyTemplate2 > b2; W_NeedyTemplate3 > b3; WS_NeedyTemplate4 > b4; SW_NeedyTemplate5 > b5; Defaulted_SW_NeedyTemplate6 > b6; Defaulted_Templated_NeedyTemplate7 > b7; W_Defaulted_Templated_NeedyTemplate8 > b8; /* The subclass of SpecializedNonMovable, is also non-memmovable, as there is no valid specialization. */ NeedyTemplate1 c1; // expected-note {{instantiation of 'NeedyTemplate1' requested here}} S_NeedyTemplate2 c2; W_NeedyTemplate3 c3; WS_NeedyTemplate4 c4; SW_NeedyTemplate5 c5; Defaulted_SW_NeedyTemplate6 c6; Defaulted_Templated_NeedyTemplate7 c7; W_Defaulted_Templated_NeedyTemplate8 c8; } class MOZ_NEEDS_MEMMOVABLE_MEMBERS NeedsMemMovableMembers { Movable m1; NonMovable m2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'm2' of type 'NonMovable'}} S_Movable sm1; S_NonMovable sm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'sm2' of type 'S_NonMovable'}} W_Movable wm1; W_NonMovable wm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'wm2' of type 'W_NonMovable'}} SW_Movable swm1; SW_NonMovable swm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'swm2' of type 'SW_NonMovable'}} WS_Movable wsm1; WS_NonMovable wsm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'wsm2' of type 'WS_NonMovable'}} SWS_Movable swsm1; SWS_NonMovable swsm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'swsm2' of type 'SWS_NonMovable'}} }; class NeedsMemMovableMembersDerived : public NeedsMemMovableMembers {};