| #define MOZ_NON_MEMMOVABLE __attribute__((annotate("moz_non_memmovable"))) |
| #define MOZ_NEEDS_MEMMOVABLE_TYPE __attribute__((annotate("moz_needs_memmovable_type"))) |
| |
| /* |
| 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 48 {{'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 32 {{'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 32 {{'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 16 {{'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 16 {{'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 <class T> |
| 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 <class T> |
| struct Template_Ref { |
| T* m; |
| }; |
| |
| template <class T> |
| struct Template_Unused {}; |
| |
| template <class T> |
| 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 <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate1 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate1<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| |
| void bad1() { |
| NeedyTemplate1<NonMovable> a1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<S_NonMovable> a2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<W_NonMovable> a3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<WS_NonMovable> a4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<SW_NonMovable> a5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<SWS_NonMovable> a6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| |
| NeedyTemplate1<Template_Inline<NonMovable> > b1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_Inline<S_NonMovable> > b2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_Inline<W_NonMovable> > b3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_Inline<WS_NonMovable> > b4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_Inline<SW_NonMovable> > b5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_Inline<SWS_NonMovable> > b6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| |
| NeedyTemplate1<Template_NonMovable<NonMovable> > c1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<S_NonMovable> > c2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<W_NonMovable> > c3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<WS_NonMovable> > c4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<SW_NonMovable> > c5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<SWS_NonMovable> > c6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<Movable> > c7; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<S_Movable> > c8; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<W_Movable> > c9; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<WS_Movable> > c10; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<SW_Movable> > c11; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| NeedyTemplate1<Template_NonMovable<SWS_Movable> > c12; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}} |
| } |
| |
| void good1() { |
| NeedyTemplate1<Movable> a1; |
| NeedyTemplate1<S_Movable> a2; |
| NeedyTemplate1<W_Movable> a3; |
| NeedyTemplate1<WS_Movable> a4; |
| NeedyTemplate1<SW_Movable> a5; |
| NeedyTemplate1<SWS_Movable> a6; |
| |
| NeedyTemplate1<Template_Inline<Movable> > b1; |
| NeedyTemplate1<Template_Inline<S_Movable> > b2; |
| NeedyTemplate1<Template_Inline<W_Movable> > b3; |
| NeedyTemplate1<Template_Inline<WS_Movable> > b4; |
| NeedyTemplate1<Template_Inline<SW_Movable> > b5; |
| NeedyTemplate1<Template_Inline<SWS_Movable> > b6; |
| |
| NeedyTemplate1<Template_Unused<Movable> > c1; |
| NeedyTemplate1<Template_Unused<S_Movable> > c2; |
| NeedyTemplate1<Template_Unused<W_Movable> > c3; |
| NeedyTemplate1<Template_Unused<WS_Movable> > c4; |
| NeedyTemplate1<Template_Unused<SW_Movable> > c5; |
| NeedyTemplate1<Template_Unused<SWS_Movable> > c6; |
| NeedyTemplate1<Template_Unused<NonMovable> > c7; |
| NeedyTemplate1<Template_Unused<S_NonMovable> > c8; |
| NeedyTemplate1<Template_Unused<W_NonMovable> > c9; |
| NeedyTemplate1<Template_Unused<WS_NonMovable> > c10; |
| NeedyTemplate1<Template_Unused<SW_NonMovable> > c11; |
| NeedyTemplate1<Template_Unused<SWS_NonMovable> > c12; |
| |
| NeedyTemplate1<Template_Ref<Movable> > d1; |
| NeedyTemplate1<Template_Ref<S_Movable> > d2; |
| NeedyTemplate1<Template_Ref<W_Movable> > d3; |
| NeedyTemplate1<Template_Ref<WS_Movable> > d4; |
| NeedyTemplate1<Template_Ref<SW_Movable> > d5; |
| NeedyTemplate1<Template_Ref<SWS_Movable> > d6; |
| NeedyTemplate1<Template_Ref<NonMovable> > d7; |
| NeedyTemplate1<Template_Ref<S_NonMovable> > d8; |
| NeedyTemplate1<Template_Ref<W_NonMovable> > d9; |
| NeedyTemplate1<Template_Ref<WS_NonMovable> > d10; |
| NeedyTemplate1<Template_Ref<SW_NonMovable> > d11; |
| NeedyTemplate1<Template_Ref<SWS_NonMovable> > d12; |
| } |
| |
| // |
| // 2 - Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE |
| // |
| |
| template <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate2 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate2<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| template <class T> |
| struct S_NeedyTemplate2 : NeedyTemplate2<T> {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate2<{{.*}}>' requested here}} |
| |
| void bad2() { |
| S_NeedyTemplate2<NonMovable> a1; |
| S_NeedyTemplate2<S_NonMovable> a2; |
| S_NeedyTemplate2<W_NonMovable> a3; |
| S_NeedyTemplate2<WS_NonMovable> a4; |
| S_NeedyTemplate2<SW_NonMovable> a5; |
| S_NeedyTemplate2<SWS_NonMovable> a6; |
| |
| S_NeedyTemplate2<Template_Inline<NonMovable> > b1; |
| S_NeedyTemplate2<Template_Inline<S_NonMovable> > b2; |
| S_NeedyTemplate2<Template_Inline<W_NonMovable> > b3; |
| S_NeedyTemplate2<Template_Inline<WS_NonMovable> > b4; |
| S_NeedyTemplate2<Template_Inline<SW_NonMovable> > b5; |
| S_NeedyTemplate2<Template_Inline<SWS_NonMovable> > b6; |
| |
| S_NeedyTemplate2<Template_NonMovable<NonMovable> > c1; |
| S_NeedyTemplate2<Template_NonMovable<S_NonMovable> > c2; |
| S_NeedyTemplate2<Template_NonMovable<W_NonMovable> > c3; |
| S_NeedyTemplate2<Template_NonMovable<WS_NonMovable> > c4; |
| S_NeedyTemplate2<Template_NonMovable<SW_NonMovable> > c5; |
| S_NeedyTemplate2<Template_NonMovable<SWS_NonMovable> > c6; |
| S_NeedyTemplate2<Template_NonMovable<Movable> > c7; |
| S_NeedyTemplate2<Template_NonMovable<S_Movable> > c8; |
| S_NeedyTemplate2<Template_NonMovable<W_Movable> > c9; |
| S_NeedyTemplate2<Template_NonMovable<WS_Movable> > c10; |
| S_NeedyTemplate2<Template_NonMovable<SW_Movable> > c11; |
| S_NeedyTemplate2<Template_NonMovable<SWS_Movable> > c12; |
| } |
| |
| void good2() { |
| S_NeedyTemplate2<Movable> a1; |
| S_NeedyTemplate2<S_Movable> a2; |
| S_NeedyTemplate2<W_Movable> a3; |
| S_NeedyTemplate2<WS_Movable> a4; |
| S_NeedyTemplate2<SW_Movable> a5; |
| S_NeedyTemplate2<SWS_Movable> a6; |
| |
| S_NeedyTemplate2<Template_Inline<Movable> > b1; |
| S_NeedyTemplate2<Template_Inline<S_Movable> > b2; |
| S_NeedyTemplate2<Template_Inline<W_Movable> > b3; |
| S_NeedyTemplate2<Template_Inline<WS_Movable> > b4; |
| S_NeedyTemplate2<Template_Inline<SW_Movable> > b5; |
| S_NeedyTemplate2<Template_Inline<SWS_Movable> > b6; |
| |
| S_NeedyTemplate2<Template_Unused<Movable> > c1; |
| S_NeedyTemplate2<Template_Unused<S_Movable> > c2; |
| S_NeedyTemplate2<Template_Unused<W_Movable> > c3; |
| S_NeedyTemplate2<Template_Unused<WS_Movable> > c4; |
| S_NeedyTemplate2<Template_Unused<SW_Movable> > c5; |
| S_NeedyTemplate2<Template_Unused<SWS_Movable> > c6; |
| S_NeedyTemplate2<Template_Unused<NonMovable> > c7; |
| S_NeedyTemplate2<Template_Unused<S_NonMovable> > c8; |
| S_NeedyTemplate2<Template_Unused<W_NonMovable> > c9; |
| S_NeedyTemplate2<Template_Unused<WS_NonMovable> > c10; |
| S_NeedyTemplate2<Template_Unused<SW_NonMovable> > c11; |
| S_NeedyTemplate2<Template_Unused<SWS_NonMovable> > c12; |
| |
| S_NeedyTemplate2<Template_Ref<Movable> > d1; |
| S_NeedyTemplate2<Template_Ref<S_Movable> > d2; |
| S_NeedyTemplate2<Template_Ref<W_Movable> > d3; |
| S_NeedyTemplate2<Template_Ref<WS_Movable> > d4; |
| S_NeedyTemplate2<Template_Ref<SW_Movable> > d5; |
| S_NeedyTemplate2<Template_Ref<SWS_Movable> > d6; |
| S_NeedyTemplate2<Template_Ref<NonMovable> > d7; |
| S_NeedyTemplate2<Template_Ref<S_NonMovable> > d8; |
| S_NeedyTemplate2<Template_Ref<W_NonMovable> > d9; |
| S_NeedyTemplate2<Template_Ref<WS_NonMovable> > d10; |
| S_NeedyTemplate2<Template_Ref<SW_NonMovable> > d11; |
| S_NeedyTemplate2<Template_Ref<SWS_NonMovable> > d12; |
| } |
| |
| // |
| // 3 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE |
| // |
| |
| template <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate3 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate3<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| template <class T> |
| struct W_NeedyTemplate3 { |
| NeedyTemplate3<T> m; // expected-note-re 26 {{instantiation of 'NeedyTemplate3<{{.*}}>' requested here}} |
| }; |
| void bad3() { |
| W_NeedyTemplate3<NonMovable> a1; |
| W_NeedyTemplate3<S_NonMovable> a2; |
| W_NeedyTemplate3<W_NonMovable> a3; |
| W_NeedyTemplate3<WS_NonMovable> a4; |
| W_NeedyTemplate3<SW_NonMovable> a5; |
| W_NeedyTemplate3<SWS_NonMovable> a6; |
| |
| W_NeedyTemplate3<Template_Inline<NonMovable> > b1; |
| W_NeedyTemplate3<Template_Inline<S_NonMovable> > b2; |
| W_NeedyTemplate3<Template_Inline<W_NonMovable> > b3; |
| W_NeedyTemplate3<Template_Inline<WS_NonMovable> > b4; |
| W_NeedyTemplate3<Template_Inline<SW_NonMovable> > b5; |
| W_NeedyTemplate3<Template_Inline<SWS_NonMovable> > b6; |
| |
| W_NeedyTemplate3<Template_NonMovable<NonMovable> > c1; |
| W_NeedyTemplate3<Template_NonMovable<S_NonMovable> > c2; |
| W_NeedyTemplate3<Template_NonMovable<W_NonMovable> > c3; |
| W_NeedyTemplate3<Template_NonMovable<WS_NonMovable> > c4; |
| W_NeedyTemplate3<Template_NonMovable<SW_NonMovable> > c5; |
| W_NeedyTemplate3<Template_NonMovable<SWS_NonMovable> > c6; |
| W_NeedyTemplate3<Template_NonMovable<Movable> > c7; |
| W_NeedyTemplate3<Template_NonMovable<S_Movable> > c8; |
| W_NeedyTemplate3<Template_NonMovable<W_Movable> > c9; |
| W_NeedyTemplate3<Template_NonMovable<WS_Movable> > c10; |
| W_NeedyTemplate3<Template_NonMovable<SW_Movable> > c11; |
| W_NeedyTemplate3<Template_NonMovable<SWS_Movable> > c12; |
| } |
| |
| void good3() { |
| W_NeedyTemplate3<Movable> a1; |
| W_NeedyTemplate3<S_Movable> a2; |
| W_NeedyTemplate3<W_Movable> a3; |
| W_NeedyTemplate3<WS_Movable> a4; |
| W_NeedyTemplate3<SW_Movable> a5; |
| W_NeedyTemplate3<SWS_Movable> a6; |
| |
| W_NeedyTemplate3<Template_Inline<Movable> > b1; |
| W_NeedyTemplate3<Template_Inline<S_Movable> > b2; |
| W_NeedyTemplate3<Template_Inline<W_Movable> > b3; |
| W_NeedyTemplate3<Template_Inline<WS_Movable> > b4; |
| W_NeedyTemplate3<Template_Inline<SW_Movable> > b5; |
| W_NeedyTemplate3<Template_Inline<SWS_Movable> > b6; |
| |
| W_NeedyTemplate3<Template_Unused<Movable> > c1; |
| W_NeedyTemplate3<Template_Unused<S_Movable> > c2; |
| W_NeedyTemplate3<Template_Unused<W_Movable> > c3; |
| W_NeedyTemplate3<Template_Unused<WS_Movable> > c4; |
| W_NeedyTemplate3<Template_Unused<SW_Movable> > c5; |
| W_NeedyTemplate3<Template_Unused<SWS_Movable> > c6; |
| W_NeedyTemplate3<Template_Unused<NonMovable> > c7; |
| W_NeedyTemplate3<Template_Unused<S_NonMovable> > c8; |
| W_NeedyTemplate3<Template_Unused<W_NonMovable> > c9; |
| W_NeedyTemplate3<Template_Unused<WS_NonMovable> > c10; |
| W_NeedyTemplate3<Template_Unused<SW_NonMovable> > c11; |
| W_NeedyTemplate3<Template_Unused<SWS_NonMovable> > c12; |
| |
| W_NeedyTemplate3<Template_Ref<Movable> > d1; |
| W_NeedyTemplate3<Template_Ref<S_Movable> > d2; |
| W_NeedyTemplate3<Template_Ref<W_Movable> > d3; |
| W_NeedyTemplate3<Template_Ref<WS_Movable> > d4; |
| W_NeedyTemplate3<Template_Ref<SW_Movable> > d5; |
| W_NeedyTemplate3<Template_Ref<SWS_Movable> > d6; |
| W_NeedyTemplate3<Template_Ref<NonMovable> > d7; |
| W_NeedyTemplate3<Template_Ref<S_NonMovable> > d8; |
| W_NeedyTemplate3<Template_Ref<W_NonMovable> > d9; |
| W_NeedyTemplate3<Template_Ref<WS_NonMovable> > d10; |
| W_NeedyTemplate3<Template_Ref<SW_NonMovable> > d11; |
| W_NeedyTemplate3<Template_Ref<SWS_NonMovable> > d12; |
| } |
| |
| // |
| // 4 - Wrapped Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE |
| // |
| |
| template <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate4 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate4<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| template <class T> |
| struct S_NeedyTemplate4 : NeedyTemplate4<T> {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate4<{{.*}}>' requested here}} |
| template <class T> |
| struct WS_NeedyTemplate4 { |
| S_NeedyTemplate4<T> m; |
| }; |
| void bad4() { |
| WS_NeedyTemplate4<NonMovable> a1; |
| WS_NeedyTemplate4<S_NonMovable> a2; |
| WS_NeedyTemplate4<W_NonMovable> a3; |
| WS_NeedyTemplate4<WS_NonMovable> a4; |
| WS_NeedyTemplate4<SW_NonMovable> a5; |
| WS_NeedyTemplate4<SWS_NonMovable> a6; |
| |
| WS_NeedyTemplate4<Template_Inline<NonMovable> > b1; |
| WS_NeedyTemplate4<Template_Inline<S_NonMovable> > b2; |
| WS_NeedyTemplate4<Template_Inline<W_NonMovable> > b3; |
| WS_NeedyTemplate4<Template_Inline<WS_NonMovable> > b4; |
| WS_NeedyTemplate4<Template_Inline<SW_NonMovable> > b5; |
| WS_NeedyTemplate4<Template_Inline<SWS_NonMovable> > b6; |
| |
| WS_NeedyTemplate4<Template_NonMovable<NonMovable> > c1; |
| WS_NeedyTemplate4<Template_NonMovable<S_NonMovable> > c2; |
| WS_NeedyTemplate4<Template_NonMovable<W_NonMovable> > c3; |
| WS_NeedyTemplate4<Template_NonMovable<WS_NonMovable> > c4; |
| WS_NeedyTemplate4<Template_NonMovable<SW_NonMovable> > c5; |
| WS_NeedyTemplate4<Template_NonMovable<SWS_NonMovable> > c6; |
| WS_NeedyTemplate4<Template_NonMovable<Movable> > c7; |
| WS_NeedyTemplate4<Template_NonMovable<S_Movable> > c8; |
| WS_NeedyTemplate4<Template_NonMovable<W_Movable> > c9; |
| WS_NeedyTemplate4<Template_NonMovable<WS_Movable> > c10; |
| WS_NeedyTemplate4<Template_NonMovable<SW_Movable> > c11; |
| WS_NeedyTemplate4<Template_NonMovable<SWS_Movable> > c12; |
| } |
| |
| void good4() { |
| WS_NeedyTemplate4<Movable> a1; |
| WS_NeedyTemplate4<S_Movable> a2; |
| WS_NeedyTemplate4<W_Movable> a3; |
| WS_NeedyTemplate4<WS_Movable> a4; |
| WS_NeedyTemplate4<SW_Movable> a5; |
| WS_NeedyTemplate4<SWS_Movable> a6; |
| |
| WS_NeedyTemplate4<Template_Inline<Movable> > b1; |
| WS_NeedyTemplate4<Template_Inline<S_Movable> > b2; |
| WS_NeedyTemplate4<Template_Inline<W_Movable> > b3; |
| WS_NeedyTemplate4<Template_Inline<WS_Movable> > b4; |
| WS_NeedyTemplate4<Template_Inline<SW_Movable> > b5; |
| WS_NeedyTemplate4<Template_Inline<SWS_Movable> > b6; |
| |
| WS_NeedyTemplate4<Template_Unused<Movable> > c1; |
| WS_NeedyTemplate4<Template_Unused<S_Movable> > c2; |
| WS_NeedyTemplate4<Template_Unused<W_Movable> > c3; |
| WS_NeedyTemplate4<Template_Unused<WS_Movable> > c4; |
| WS_NeedyTemplate4<Template_Unused<SW_Movable> > c5; |
| WS_NeedyTemplate4<Template_Unused<SWS_Movable> > c6; |
| WS_NeedyTemplate4<Template_Unused<NonMovable> > c7; |
| WS_NeedyTemplate4<Template_Unused<S_NonMovable> > c8; |
| WS_NeedyTemplate4<Template_Unused<W_NonMovable> > c9; |
| WS_NeedyTemplate4<Template_Unused<WS_NonMovable> > c10; |
| WS_NeedyTemplate4<Template_Unused<SW_NonMovable> > c11; |
| WS_NeedyTemplate4<Template_Unused<SWS_NonMovable> > c12; |
| |
| WS_NeedyTemplate4<Template_Ref<Movable> > d1; |
| WS_NeedyTemplate4<Template_Ref<S_Movable> > d2; |
| WS_NeedyTemplate4<Template_Ref<W_Movable> > d3; |
| WS_NeedyTemplate4<Template_Ref<WS_Movable> > d4; |
| WS_NeedyTemplate4<Template_Ref<SW_Movable> > d5; |
| WS_NeedyTemplate4<Template_Ref<SWS_Movable> > d6; |
| WS_NeedyTemplate4<Template_Ref<NonMovable> > d7; |
| WS_NeedyTemplate4<Template_Ref<S_NonMovable> > d8; |
| WS_NeedyTemplate4<Template_Ref<W_NonMovable> > d9; |
| WS_NeedyTemplate4<Template_Ref<WS_NonMovable> > d10; |
| WS_NeedyTemplate4<Template_Ref<SW_NonMovable> > d11; |
| WS_NeedyTemplate4<Template_Ref<SWS_NonMovable> > d12; |
| } |
| |
| // |
| // 5 - Subclassed Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE |
| // |
| |
| template <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate5 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate5<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| template <class T> |
| struct W_NeedyTemplate5 { |
| NeedyTemplate5<T> m; // expected-note-re 26 {{instantiation of 'NeedyTemplate5<{{.*}}>' requested here}} |
| }; |
| template <class T> |
| struct SW_NeedyTemplate5 : W_NeedyTemplate5<T> {}; |
| void bad5() { |
| SW_NeedyTemplate5<NonMovable> a1; |
| SW_NeedyTemplate5<S_NonMovable> a2; |
| SW_NeedyTemplate5<W_NonMovable> a3; |
| SW_NeedyTemplate5<WS_NonMovable> a4; |
| SW_NeedyTemplate5<SW_NonMovable> a5; |
| SW_NeedyTemplate5<SWS_NonMovable> a6; |
| |
| SW_NeedyTemplate5<Template_Inline<NonMovable> > b1; |
| SW_NeedyTemplate5<Template_Inline<S_NonMovable> > b2; |
| SW_NeedyTemplate5<Template_Inline<W_NonMovable> > b3; |
| SW_NeedyTemplate5<Template_Inline<WS_NonMovable> > b4; |
| SW_NeedyTemplate5<Template_Inline<SW_NonMovable> > b5; |
| SW_NeedyTemplate5<Template_Inline<SWS_NonMovable> > b6; |
| |
| SW_NeedyTemplate5<Template_NonMovable<NonMovable> > c1; |
| SW_NeedyTemplate5<Template_NonMovable<S_NonMovable> > c2; |
| SW_NeedyTemplate5<Template_NonMovable<W_NonMovable> > c3; |
| SW_NeedyTemplate5<Template_NonMovable<WS_NonMovable> > c4; |
| SW_NeedyTemplate5<Template_NonMovable<SW_NonMovable> > c5; |
| SW_NeedyTemplate5<Template_NonMovable<SWS_NonMovable> > c6; |
| SW_NeedyTemplate5<Template_NonMovable<Movable> > c7; |
| SW_NeedyTemplate5<Template_NonMovable<S_Movable> > c8; |
| SW_NeedyTemplate5<Template_NonMovable<W_Movable> > c9; |
| SW_NeedyTemplate5<Template_NonMovable<WS_Movable> > c10; |
| SW_NeedyTemplate5<Template_NonMovable<SW_Movable> > c11; |
| SW_NeedyTemplate5<Template_NonMovable<SWS_Movable> > c12; |
| } |
| |
| void good5() { |
| SW_NeedyTemplate5<Movable> a1; |
| SW_NeedyTemplate5<S_Movable> a2; |
| SW_NeedyTemplate5<W_Movable> a3; |
| SW_NeedyTemplate5<WS_Movable> a4; |
| SW_NeedyTemplate5<SW_Movable> a5; |
| SW_NeedyTemplate5<SWS_Movable> a6; |
| |
| SW_NeedyTemplate5<Template_Inline<Movable> > b1; |
| SW_NeedyTemplate5<Template_Inline<S_Movable> > b2; |
| SW_NeedyTemplate5<Template_Inline<W_Movable> > b3; |
| SW_NeedyTemplate5<Template_Inline<WS_Movable> > b4; |
| SW_NeedyTemplate5<Template_Inline<SW_Movable> > b5; |
| SW_NeedyTemplate5<Template_Inline<SWS_Movable> > b6; |
| |
| SW_NeedyTemplate5<Template_Unused<Movable> > c1; |
| SW_NeedyTemplate5<Template_Unused<S_Movable> > c2; |
| SW_NeedyTemplate5<Template_Unused<W_Movable> > c3; |
| SW_NeedyTemplate5<Template_Unused<WS_Movable> > c4; |
| SW_NeedyTemplate5<Template_Unused<SW_Movable> > c5; |
| SW_NeedyTemplate5<Template_Unused<SWS_Movable> > c6; |
| SW_NeedyTemplate5<Template_Unused<NonMovable> > c7; |
| SW_NeedyTemplate5<Template_Unused<S_NonMovable> > c8; |
| SW_NeedyTemplate5<Template_Unused<W_NonMovable> > c9; |
| SW_NeedyTemplate5<Template_Unused<WS_NonMovable> > c10; |
| SW_NeedyTemplate5<Template_Unused<SW_NonMovable> > c11; |
| SW_NeedyTemplate5<Template_Unused<SWS_NonMovable> > c12; |
| |
| SW_NeedyTemplate5<Template_Ref<Movable> > d1; |
| SW_NeedyTemplate5<Template_Ref<S_Movable> > d2; |
| SW_NeedyTemplate5<Template_Ref<W_Movable> > d3; |
| SW_NeedyTemplate5<Template_Ref<WS_Movable> > d4; |
| SW_NeedyTemplate5<Template_Ref<SW_Movable> > d5; |
| SW_NeedyTemplate5<Template_Ref<SWS_Movable> > d6; |
| SW_NeedyTemplate5<Template_Ref<NonMovable> > d7; |
| SW_NeedyTemplate5<Template_Ref<S_NonMovable> > d8; |
| SW_NeedyTemplate5<Template_Ref<W_NonMovable> > d9; |
| SW_NeedyTemplate5<Template_Ref<WS_NonMovable> > d10; |
| SW_NeedyTemplate5<Template_Ref<SW_NonMovable> > d11; |
| SW_NeedyTemplate5<Template_Ref<SWS_NonMovable> > 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 <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate6 {T m;}; // expected-error-re 27 {{Cannot instantiate 'NeedyTemplate6<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| template <class T> |
| struct W_NeedyTemplate6 { |
| NeedyTemplate6<T> m; // expected-note-re 27 {{instantiation of 'NeedyTemplate6<{{.*}}>' requested here}} |
| }; |
| template <class T> |
| struct SW_NeedyTemplate6 : W_NeedyTemplate6<T> {}; |
| // We create a different NonMovable type here, as NeedyTemplate6 will already be instantiated with NonMovable |
| struct MOZ_NON_MEMMOVABLE NonMovable2 {}; |
| template <class T = NonMovable2> |
| struct Defaulted_SW_NeedyTemplate6 { |
| SW_NeedyTemplate6<T> m; |
| }; |
| void bad6() { |
| Defaulted_SW_NeedyTemplate6<NonMovable> a1; |
| Defaulted_SW_NeedyTemplate6<S_NonMovable> a2; |
| Defaulted_SW_NeedyTemplate6<W_NonMovable> a3; |
| Defaulted_SW_NeedyTemplate6<WS_NonMovable> a4; |
| Defaulted_SW_NeedyTemplate6<SW_NonMovable> a5; |
| Defaulted_SW_NeedyTemplate6<SWS_NonMovable> a6; |
| |
| Defaulted_SW_NeedyTemplate6<Template_Inline<NonMovable> > b1; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<S_NonMovable> > b2; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<W_NonMovable> > b3; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<WS_NonMovable> > b4; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<SW_NonMovable> > b5; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<SWS_NonMovable> > b6; |
| |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<NonMovable> > c1; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<S_NonMovable> > c2; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<W_NonMovable> > c3; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<WS_NonMovable> > c4; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<SW_NonMovable> > c5; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<SWS_NonMovable> > c6; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<Movable> > c7; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<S_Movable> > c8; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<W_Movable> > c9; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<WS_Movable> > c10; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<SW_Movable> > c11; |
| Defaulted_SW_NeedyTemplate6<Template_NonMovable<SWS_Movable> > c12; |
| |
| Defaulted_SW_NeedyTemplate6<> c13; |
| } |
| |
| void good6() { |
| Defaulted_SW_NeedyTemplate6<Movable> a1; |
| Defaulted_SW_NeedyTemplate6<S_Movable> a2; |
| Defaulted_SW_NeedyTemplate6<W_Movable> a3; |
| Defaulted_SW_NeedyTemplate6<WS_Movable> a4; |
| Defaulted_SW_NeedyTemplate6<SW_Movable> a5; |
| Defaulted_SW_NeedyTemplate6<SWS_Movable> a6; |
| |
| Defaulted_SW_NeedyTemplate6<Template_Inline<Movable> > b1; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<S_Movable> > b2; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<W_Movable> > b3; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<WS_Movable> > b4; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<SW_Movable> > b5; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<SWS_Movable> > b6; |
| |
| Defaulted_SW_NeedyTemplate6<Template_Unused<Movable> > c1; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<S_Movable> > c2; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<W_Movable> > c3; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<WS_Movable> > c4; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<SW_Movable> > c5; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<SWS_Movable> > c6; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<NonMovable> > c7; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<S_NonMovable> > c8; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<W_NonMovable> > c9; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<WS_NonMovable> > c10; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<SW_NonMovable> > c11; |
| Defaulted_SW_NeedyTemplate6<Template_Unused<SWS_NonMovable> > c12; |
| |
| Defaulted_SW_NeedyTemplate6<Template_Ref<Movable> > d1; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<S_Movable> > d2; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<W_Movable> > d3; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<WS_Movable> > d4; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<SW_Movable> > d5; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<SWS_Movable> > d6; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<NonMovable> > d7; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<S_NonMovable> > d8; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<W_NonMovable> > d9; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<WS_NonMovable> > d10; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<SW_NonMovable> > d11; |
| Defaulted_SW_NeedyTemplate6<Template_Ref<SWS_NonMovable> > d12; |
| } |
| |
| // |
| // 7 - MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument |
| // |
| |
| template <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate7 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate7<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| template <class T, class Q = NeedyTemplate7<T> > |
| struct Defaulted_Templated_NeedyTemplate7 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate7<{{.*}}>' requested here}} |
| void bad7() { |
| Defaulted_Templated_NeedyTemplate7<NonMovable> a1; |
| Defaulted_Templated_NeedyTemplate7<S_NonMovable> a2; |
| Defaulted_Templated_NeedyTemplate7<W_NonMovable> a3; |
| Defaulted_Templated_NeedyTemplate7<WS_NonMovable> a4; |
| Defaulted_Templated_NeedyTemplate7<SW_NonMovable> a5; |
| Defaulted_Templated_NeedyTemplate7<SWS_NonMovable> a6; |
| |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<NonMovable> > b1; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<S_NonMovable> > b2; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<W_NonMovable> > b3; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<WS_NonMovable> > b4; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<SW_NonMovable> > b5; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<SWS_NonMovable> > b6; |
| |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<NonMovable> > c1; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<S_NonMovable> > c2; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<W_NonMovable> > c3; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<WS_NonMovable> > c4; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SW_NonMovable> > c5; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SWS_NonMovable> > c6; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<Movable> > c7; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<S_Movable> > c8; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<W_Movable> > c9; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<WS_Movable> > c10; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SW_Movable> > c11; |
| Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SWS_Movable> > c12; |
| } |
| |
| void good7() { |
| Defaulted_Templated_NeedyTemplate7<Movable> a1; |
| Defaulted_Templated_NeedyTemplate7<S_Movable> a2; |
| Defaulted_Templated_NeedyTemplate7<W_Movable> a3; |
| Defaulted_Templated_NeedyTemplate7<WS_Movable> a4; |
| Defaulted_Templated_NeedyTemplate7<SW_Movable> a5; |
| Defaulted_Templated_NeedyTemplate7<SWS_Movable> a6; |
| |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<Movable> > b1; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<S_Movable> > b2; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<W_Movable> > b3; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<WS_Movable> > b4; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<SW_Movable> > b5; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<SWS_Movable> > b6; |
| |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<Movable> > c1; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<S_Movable> > c2; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<W_Movable> > c3; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<WS_Movable> > c4; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<SW_Movable> > c5; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<SWS_Movable> > c6; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<NonMovable> > c7; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<S_NonMovable> > c8; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<W_NonMovable> > c9; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<WS_NonMovable> > c10; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<SW_NonMovable> > c11; |
| Defaulted_Templated_NeedyTemplate7<Template_Unused<SWS_NonMovable> > c12; |
| |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<Movable> > d1; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<S_Movable> > d2; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<W_Movable> > d3; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<WS_Movable> > d4; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<SW_Movable> > d5; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<SWS_Movable> > d6; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<NonMovable> > d7; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<S_NonMovable> > d8; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<W_NonMovable> > d9; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<WS_NonMovable> > d10; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<SW_NonMovable> > d11; |
| Defaulted_Templated_NeedyTemplate7<Template_Ref<SWS_NonMovable> > d12; |
| } |
| |
| // |
| // 8 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument |
| // |
| |
| template <class T> |
| struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate8 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate8<{{.*}}>' with non-memmovable template argument '{{.*}}'}} |
| template <class T, class Q = NeedyTemplate8<T> > |
| struct Defaulted_Templated_NeedyTemplate8 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate8<{{.*}}>' requested here}} |
| template <class T> |
| struct W_Defaulted_Templated_NeedyTemplate8 { |
| Defaulted_Templated_NeedyTemplate8<T> m; |
| }; |
| void bad8() { |
| W_Defaulted_Templated_NeedyTemplate8<NonMovable> a1; |
| W_Defaulted_Templated_NeedyTemplate8<S_NonMovable> a2; |
| W_Defaulted_Templated_NeedyTemplate8<W_NonMovable> a3; |
| W_Defaulted_Templated_NeedyTemplate8<WS_NonMovable> a4; |
| W_Defaulted_Templated_NeedyTemplate8<SW_NonMovable> a5; |
| W_Defaulted_Templated_NeedyTemplate8<SWS_NonMovable> a6; |
| |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<NonMovable> > b1; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<S_NonMovable> > b2; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<W_NonMovable> > b3; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<WS_NonMovable> > b4; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SW_NonMovable> > b5; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SWS_NonMovable> > b6; |
| |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<NonMovable> > c1; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<S_NonMovable> > c2; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<W_NonMovable> > c3; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<WS_NonMovable> > c4; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SW_NonMovable> > c5; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SWS_NonMovable> > c6; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<Movable> > c7; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<S_Movable> > c8; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<W_Movable> > c9; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<WS_Movable> > c10; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SW_Movable> > c11; |
| W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SWS_Movable> > c12; |
| } |
| |
| void good8() { |
| W_Defaulted_Templated_NeedyTemplate8<Movable> a1; |
| W_Defaulted_Templated_NeedyTemplate8<S_Movable> a2; |
| W_Defaulted_Templated_NeedyTemplate8<W_Movable> a3; |
| W_Defaulted_Templated_NeedyTemplate8<WS_Movable> a4; |
| W_Defaulted_Templated_NeedyTemplate8<SW_Movable> a5; |
| W_Defaulted_Templated_NeedyTemplate8<SWS_Movable> a6; |
| |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<Movable> > b1; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<S_Movable> > b2; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<W_Movable> > b3; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<WS_Movable> > b4; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SW_Movable> > b5; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SWS_Movable> > b6; |
| |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<Movable> > c1; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<S_Movable> > c2; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<W_Movable> > c3; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<WS_Movable> > c4; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SW_Movable> > c5; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SWS_Movable> > c6; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<NonMovable> > c7; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<S_NonMovable> > c8; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<W_NonMovable> > c9; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<WS_NonMovable> > c10; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SW_NonMovable> > c11; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SWS_NonMovable> > c12; |
| |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<Movable> > d1; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<S_Movable> > d2; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<W_Movable> > d3; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<WS_Movable> > d4; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SW_Movable> > d5; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SWS_Movable> > d6; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<NonMovable> > d7; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<S_NonMovable> > d8; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<W_NonMovable> > d9; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<WS_NonMovable> > d10; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SW_NonMovable> > d11; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SWS_NonMovable> > d12; |
| } |
| |
| /* |
| SpecializedNonMovable is a non-movable class which has an explicit specialization of NeedyTemplate |
| for it. Instantiations of NeedyTemplateN<SpecializedNonMovable> 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<SpecializedNonMovable> {}; |
| template <> |
| struct NeedyTemplate2<SpecializedNonMovable> {}; |
| template <> |
| struct NeedyTemplate3<SpecializedNonMovable> {}; |
| template <> |
| struct NeedyTemplate4<SpecializedNonMovable> {}; |
| template <> |
| struct NeedyTemplate5<SpecializedNonMovable> {}; |
| template <> |
| struct NeedyTemplate6<SpecializedNonMovable> {}; |
| template <> |
| struct NeedyTemplate7<SpecializedNonMovable> {}; |
| template <> |
| struct NeedyTemplate8<SpecializedNonMovable> {}; |
| |
| void specialization() { |
| /* |
| SpecializedNonMovable has a specialization for every variant of NeedyTemplate, |
| so these templates are valid, even though SpecializedNonMovable isn't |
| memmovable |
| */ |
| NeedyTemplate1<SpecializedNonMovable> a1; |
| S_NeedyTemplate2<SpecializedNonMovable> a2; |
| W_NeedyTemplate3<SpecializedNonMovable> a3; |
| WS_NeedyTemplate4<SpecializedNonMovable> a4; |
| SW_NeedyTemplate5<SpecializedNonMovable> a5; |
| Defaulted_SW_NeedyTemplate6<SpecializedNonMovable> a6; |
| Defaulted_Templated_NeedyTemplate7<SpecializedNonMovable> a7; |
| W_Defaulted_Templated_NeedyTemplate8<SpecializedNonMovable> 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<Template_Inline<SpecializedNonMovable> > b1; // expected-note {{instantiation of 'NeedyTemplate1<Template_Inline<SpecializedNonMovable> >' requested here}} |
| S_NeedyTemplate2<Template_Inline<SpecializedNonMovable> > b2; |
| W_NeedyTemplate3<Template_Inline<SpecializedNonMovable> > b3; |
| WS_NeedyTemplate4<Template_Inline<SpecializedNonMovable> > b4; |
| SW_NeedyTemplate5<Template_Inline<SpecializedNonMovable> > b5; |
| Defaulted_SW_NeedyTemplate6<Template_Inline<SpecializedNonMovable> > b6; |
| Defaulted_Templated_NeedyTemplate7<Template_Inline<SpecializedNonMovable> > b7; |
| W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SpecializedNonMovable> > b8; |
| |
| /* |
| The subclass of SpecializedNonMovable, is also non-memmovable, |
| as there is no valid specialization. |
| */ |
| NeedyTemplate1<S_SpecializedNonMovable> c1; // expected-note {{instantiation of 'NeedyTemplate1<S_SpecializedNonMovable>' requested here}} |
| S_NeedyTemplate2<S_SpecializedNonMovable> c2; |
| W_NeedyTemplate3<S_SpecializedNonMovable> c3; |
| WS_NeedyTemplate4<S_SpecializedNonMovable> c4; |
| SW_NeedyTemplate5<S_SpecializedNonMovable> c5; |
| Defaulted_SW_NeedyTemplate6<S_SpecializedNonMovable> c6; |
| Defaulted_Templated_NeedyTemplate7<S_SpecializedNonMovable> c7; |
| W_Defaulted_Templated_NeedyTemplate8<S_SpecializedNonMovable> c8; |
| } |