tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TestNonMemMovable.cpp (41660B)


      1 #define MOZ_NON_MEMMOVABLE __attribute__((annotate("moz_non_memmovable")))
      2 #define MOZ_NEEDS_MEMMOVABLE_TYPE __attribute__((annotate("moz_needs_memmovable_type")))
      3 #define MOZ_NEEDS_MEMMOVABLE_MEMBERS __attribute__((annotate("moz_needs_memmovable_members")))
      4 
      5 /*
      6  These are a bunch of structs with variable levels of memmovability.
      7  They will be used as template parameters to the various NeedyTemplates
      8 */
      9 struct MOZ_NON_MEMMOVABLE NonMovable {};
     10 struct Movable {};
     11 
     12 // Subclasses
     13 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'}}
     14 struct S_Movable : Movable {};
     15 
     16 // Members
     17 struct W_NonMovable {
     18  NonMovable m; // expected-note 34 {{'W_NonMovable' is a non-memmove()able type because member 'm' is a non-memmove()able type 'NonMovable'}}
     19 };
     20 struct W_Movable {
     21  Movable m;
     22 };
     23 
     24 // Wrapped Subclasses
     25 struct WS_NonMovable {
     26  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'}}
     27 };
     28 struct WS_Movable {
     29  S_Movable m;
     30 };
     31 
     32 // Combinations of the above
     33 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'}}
     34 struct SW_Movable : W_Movable {};
     35 
     36 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'}}
     37 struct SWS_Movable : WS_Movable {};
     38 
     39 // Basic templated wrapper
     40 template <class T>
     41 struct Template_Inline {
     42  T m; // expected-note-re 56 {{'Template_Inline<{{.*}}>' is a non-memmove()able type because member 'm' is a non-memmove()able type '{{.*}}'}}
     43 };
     44 
     45 template <class T>
     46 struct Template_Ref {
     47  T* m;
     48 };
     49 
     50 template <class T>
     51 struct Template_Unused {};
     52 
     53 template <class T>
     54 struct MOZ_NON_MEMMOVABLE Template_NonMovable {};
     55 
     56 /*
     57  These tests take the following form:
     58  DECLARATIONS => Declarations of the templates which are either marked with MOZ_NEEDS_MEMMOVABLE_TYPE
     59                  or which instantiate a MOZ_NEEDS_MEMMOVABLE_TYPE through some mechanism.
     60  BAD N        => Instantiations of the wrapper template with each of the non-memmovable types.
     61                  The prefix S_ means subclass, W_ means wrapped. Each of these rows should produce an error
     62                  on the NeedyTemplate in question, and a note at the instantiation location of that template.
     63                  Unfortunately, on every case more complicated than bad1, the instantiation location is
     64                  within another template. Thus, the notes are expected on the template in question which
     65                  actually instantiates the MOZ_NEEDS_MEMMOVABLE_TYPE template.
     66  GOOD N       => Instantiations of the wrapper template with each of the memmovable types.
     67                  This is meant as a sanity check to ensure that we don't reject valid instantiations of
     68                  templates.
     69 
     70 
     71  Note 1: Each set uses it's own types to ensure that they don't re-use each-other's template specializations.
     72  If they did, then some of the error messages would not be emitted (as error messages are emitted for template
     73  specializations, rather than for variable declarations)
     74 
     75  Note 2: Every instance of NeedyTemplate contains a member of type T. This is to ensure that T is actually
     76  instantiated (if T is a template) by clang. If T isn't instantiated, then we can't actually tell if it is
     77  NON_MEMMOVABLE. (This is OK in practice, as you cannot memmove a type which you don't know the size of).
     78 
     79  Note 3: There are a set of tests for specializations of NeedyTemplate at the bottom. For each set of tests,
     80  these tests contribute two expected errors to the templates.
     81 */
     82 
     83 //
     84 // 1 - Unwrapped MOZ_NEEDS_MEMMOVABLE_TYPE
     85 //
     86 
     87 template <class T>
     88 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate1 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate1<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
     89 
     90 void bad1() {
     91  NeedyTemplate1<NonMovable> a1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
     92  NeedyTemplate1<S_NonMovable> a2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
     93  NeedyTemplate1<W_NonMovable> a3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
     94  NeedyTemplate1<WS_NonMovable> a4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
     95  NeedyTemplate1<SW_NonMovable> a5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
     96  NeedyTemplate1<SWS_NonMovable> a6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
     97 
     98  NeedyTemplate1<Template_Inline<NonMovable> > b1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
     99  NeedyTemplate1<Template_Inline<S_NonMovable> > b2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    100  NeedyTemplate1<Template_Inline<W_NonMovable> > b3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    101  NeedyTemplate1<Template_Inline<WS_NonMovable> > b4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    102  NeedyTemplate1<Template_Inline<SW_NonMovable> > b5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    103  NeedyTemplate1<Template_Inline<SWS_NonMovable> > b6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    104 
    105  NeedyTemplate1<Template_NonMovable<NonMovable> > c1; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    106  NeedyTemplate1<Template_NonMovable<S_NonMovable> > c2; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    107  NeedyTemplate1<Template_NonMovable<W_NonMovable> > c3; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    108  NeedyTemplate1<Template_NonMovable<WS_NonMovable> > c4; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    109  NeedyTemplate1<Template_NonMovable<SW_NonMovable> > c5; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    110  NeedyTemplate1<Template_NonMovable<SWS_NonMovable> > c6; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    111  NeedyTemplate1<Template_NonMovable<Movable> > c7; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    112  NeedyTemplate1<Template_NonMovable<S_Movable> > c8; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    113  NeedyTemplate1<Template_NonMovable<W_Movable> > c9; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    114  NeedyTemplate1<Template_NonMovable<WS_Movable> > c10; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    115  NeedyTemplate1<Template_NonMovable<SW_Movable> > c11; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    116  NeedyTemplate1<Template_NonMovable<SWS_Movable> > c12; // expected-note-re {{instantiation of 'NeedyTemplate1<{{.*}}>' requested here}}
    117 }
    118 
    119 void good1() {
    120  NeedyTemplate1<Movable> a1;
    121  NeedyTemplate1<S_Movable> a2;
    122  NeedyTemplate1<W_Movable> a3;
    123  NeedyTemplate1<WS_Movable> a4;
    124  NeedyTemplate1<SW_Movable> a5;
    125  NeedyTemplate1<SWS_Movable> a6;
    126 
    127  NeedyTemplate1<Template_Inline<Movable> > b1;
    128  NeedyTemplate1<Template_Inline<S_Movable> > b2;
    129  NeedyTemplate1<Template_Inline<W_Movable> > b3;
    130  NeedyTemplate1<Template_Inline<WS_Movable> > b4;
    131  NeedyTemplate1<Template_Inline<SW_Movable> > b5;
    132  NeedyTemplate1<Template_Inline<SWS_Movable> > b6;
    133 
    134  NeedyTemplate1<Template_Unused<Movable> > c1;
    135  NeedyTemplate1<Template_Unused<S_Movable> > c2;
    136  NeedyTemplate1<Template_Unused<W_Movable> > c3;
    137  NeedyTemplate1<Template_Unused<WS_Movable> > c4;
    138  NeedyTemplate1<Template_Unused<SW_Movable> > c5;
    139  NeedyTemplate1<Template_Unused<SWS_Movable> > c6;
    140  NeedyTemplate1<Template_Unused<NonMovable> > c7;
    141  NeedyTemplate1<Template_Unused<S_NonMovable> > c8;
    142  NeedyTemplate1<Template_Unused<W_NonMovable> > c9;
    143  NeedyTemplate1<Template_Unused<WS_NonMovable> > c10;
    144  NeedyTemplate1<Template_Unused<SW_NonMovable> > c11;
    145  NeedyTemplate1<Template_Unused<SWS_NonMovable> > c12;
    146 
    147  NeedyTemplate1<Template_Ref<Movable> > d1;
    148  NeedyTemplate1<Template_Ref<S_Movable> > d2;
    149  NeedyTemplate1<Template_Ref<W_Movable> > d3;
    150  NeedyTemplate1<Template_Ref<WS_Movable> > d4;
    151  NeedyTemplate1<Template_Ref<SW_Movable> > d5;
    152  NeedyTemplate1<Template_Ref<SWS_Movable> > d6;
    153  NeedyTemplate1<Template_Ref<NonMovable> > d7;
    154  NeedyTemplate1<Template_Ref<S_NonMovable> > d8;
    155  NeedyTemplate1<Template_Ref<W_NonMovable> > d9;
    156  NeedyTemplate1<Template_Ref<WS_NonMovable> > d10;
    157  NeedyTemplate1<Template_Ref<SW_NonMovable> > d11;
    158  NeedyTemplate1<Template_Ref<SWS_NonMovable> > d12;
    159 }
    160 
    161 //
    162 // 2 - Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE
    163 //
    164 
    165 template <class T>
    166 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate2 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate2<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
    167 template <class T>
    168 struct S_NeedyTemplate2 : NeedyTemplate2<T> {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate2<{{.*}}>' requested here}}
    169 
    170 void bad2() {
    171  S_NeedyTemplate2<NonMovable> a1;
    172  S_NeedyTemplate2<S_NonMovable> a2;
    173  S_NeedyTemplate2<W_NonMovable> a3;
    174  S_NeedyTemplate2<WS_NonMovable> a4;
    175  S_NeedyTemplate2<SW_NonMovable> a5;
    176  S_NeedyTemplate2<SWS_NonMovable> a6;
    177 
    178  S_NeedyTemplate2<Template_Inline<NonMovable> > b1;
    179  S_NeedyTemplate2<Template_Inline<S_NonMovable> > b2;
    180  S_NeedyTemplate2<Template_Inline<W_NonMovable> > b3;
    181  S_NeedyTemplate2<Template_Inline<WS_NonMovable> > b4;
    182  S_NeedyTemplate2<Template_Inline<SW_NonMovable> > b5;
    183  S_NeedyTemplate2<Template_Inline<SWS_NonMovable> > b6;
    184 
    185  S_NeedyTemplate2<Template_NonMovable<NonMovable> > c1;
    186  S_NeedyTemplate2<Template_NonMovable<S_NonMovable> > c2;
    187  S_NeedyTemplate2<Template_NonMovable<W_NonMovable> > c3;
    188  S_NeedyTemplate2<Template_NonMovable<WS_NonMovable> > c4;
    189  S_NeedyTemplate2<Template_NonMovable<SW_NonMovable> > c5;
    190  S_NeedyTemplate2<Template_NonMovable<SWS_NonMovable> > c6;
    191  S_NeedyTemplate2<Template_NonMovable<Movable> > c7;
    192  S_NeedyTemplate2<Template_NonMovable<S_Movable> > c8;
    193  S_NeedyTemplate2<Template_NonMovable<W_Movable> > c9;
    194  S_NeedyTemplate2<Template_NonMovable<WS_Movable> > c10;
    195  S_NeedyTemplate2<Template_NonMovable<SW_Movable> > c11;
    196  S_NeedyTemplate2<Template_NonMovable<SWS_Movable> > c12;
    197 }
    198 
    199 void good2() {
    200  S_NeedyTemplate2<Movable> a1;
    201  S_NeedyTemplate2<S_Movable> a2;
    202  S_NeedyTemplate2<W_Movable> a3;
    203  S_NeedyTemplate2<WS_Movable> a4;
    204  S_NeedyTemplate2<SW_Movable> a5;
    205  S_NeedyTemplate2<SWS_Movable> a6;
    206 
    207  S_NeedyTemplate2<Template_Inline<Movable> > b1;
    208  S_NeedyTemplate2<Template_Inline<S_Movable> > b2;
    209  S_NeedyTemplate2<Template_Inline<W_Movable> > b3;
    210  S_NeedyTemplate2<Template_Inline<WS_Movable> > b4;
    211  S_NeedyTemplate2<Template_Inline<SW_Movable> > b5;
    212  S_NeedyTemplate2<Template_Inline<SWS_Movable> > b6;
    213 
    214  S_NeedyTemplate2<Template_Unused<Movable> > c1;
    215  S_NeedyTemplate2<Template_Unused<S_Movable> > c2;
    216  S_NeedyTemplate2<Template_Unused<W_Movable> > c3;
    217  S_NeedyTemplate2<Template_Unused<WS_Movable> > c4;
    218  S_NeedyTemplate2<Template_Unused<SW_Movable> > c5;
    219  S_NeedyTemplate2<Template_Unused<SWS_Movable> > c6;
    220  S_NeedyTemplate2<Template_Unused<NonMovable> > c7;
    221  S_NeedyTemplate2<Template_Unused<S_NonMovable> > c8;
    222  S_NeedyTemplate2<Template_Unused<W_NonMovable> > c9;
    223  S_NeedyTemplate2<Template_Unused<WS_NonMovable> > c10;
    224  S_NeedyTemplate2<Template_Unused<SW_NonMovable> > c11;
    225  S_NeedyTemplate2<Template_Unused<SWS_NonMovable> > c12;
    226 
    227  S_NeedyTemplate2<Template_Ref<Movable> > d1;
    228  S_NeedyTemplate2<Template_Ref<S_Movable> > d2;
    229  S_NeedyTemplate2<Template_Ref<W_Movable> > d3;
    230  S_NeedyTemplate2<Template_Ref<WS_Movable> > d4;
    231  S_NeedyTemplate2<Template_Ref<SW_Movable> > d5;
    232  S_NeedyTemplate2<Template_Ref<SWS_Movable> > d6;
    233  S_NeedyTemplate2<Template_Ref<NonMovable> > d7;
    234  S_NeedyTemplate2<Template_Ref<S_NonMovable> > d8;
    235  S_NeedyTemplate2<Template_Ref<W_NonMovable> > d9;
    236  S_NeedyTemplate2<Template_Ref<WS_NonMovable> > d10;
    237  S_NeedyTemplate2<Template_Ref<SW_NonMovable> > d11;
    238  S_NeedyTemplate2<Template_Ref<SWS_NonMovable> > d12;
    239 }
    240 
    241 //
    242 // 3 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE
    243 //
    244 
    245 template <class T>
    246 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate3 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate3<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
    247 template <class T>
    248 struct W_NeedyTemplate3 {
    249  NeedyTemplate3<T> m; // expected-note-re 26 {{instantiation of 'NeedyTemplate3<{{.*}}>' requested here}}
    250 };
    251 void bad3() {
    252  W_NeedyTemplate3<NonMovable> a1;
    253  W_NeedyTemplate3<S_NonMovable> a2;
    254  W_NeedyTemplate3<W_NonMovable> a3;
    255  W_NeedyTemplate3<WS_NonMovable> a4;
    256  W_NeedyTemplate3<SW_NonMovable> a5;
    257  W_NeedyTemplate3<SWS_NonMovable> a6;
    258 
    259  W_NeedyTemplate3<Template_Inline<NonMovable> > b1;
    260  W_NeedyTemplate3<Template_Inline<S_NonMovable> > b2;
    261  W_NeedyTemplate3<Template_Inline<W_NonMovable> > b3;
    262  W_NeedyTemplate3<Template_Inline<WS_NonMovable> > b4;
    263  W_NeedyTemplate3<Template_Inline<SW_NonMovable> > b5;
    264  W_NeedyTemplate3<Template_Inline<SWS_NonMovable> > b6;
    265 
    266  W_NeedyTemplate3<Template_NonMovable<NonMovable> > c1;
    267  W_NeedyTemplate3<Template_NonMovable<S_NonMovable> > c2;
    268  W_NeedyTemplate3<Template_NonMovable<W_NonMovable> > c3;
    269  W_NeedyTemplate3<Template_NonMovable<WS_NonMovable> > c4;
    270  W_NeedyTemplate3<Template_NonMovable<SW_NonMovable> > c5;
    271  W_NeedyTemplate3<Template_NonMovable<SWS_NonMovable> > c6;
    272  W_NeedyTemplate3<Template_NonMovable<Movable> > c7;
    273  W_NeedyTemplate3<Template_NonMovable<S_Movable> > c8;
    274  W_NeedyTemplate3<Template_NonMovable<W_Movable> > c9;
    275  W_NeedyTemplate3<Template_NonMovable<WS_Movable> > c10;
    276  W_NeedyTemplate3<Template_NonMovable<SW_Movable> > c11;
    277  W_NeedyTemplate3<Template_NonMovable<SWS_Movable> > c12;
    278 }
    279 
    280 void good3() {
    281  W_NeedyTemplate3<Movable> a1;
    282  W_NeedyTemplate3<S_Movable> a2;
    283  W_NeedyTemplate3<W_Movable> a3;
    284  W_NeedyTemplate3<WS_Movable> a4;
    285  W_NeedyTemplate3<SW_Movable> a5;
    286  W_NeedyTemplate3<SWS_Movable> a6;
    287 
    288  W_NeedyTemplate3<Template_Inline<Movable> > b1;
    289  W_NeedyTemplate3<Template_Inline<S_Movable> > b2;
    290  W_NeedyTemplate3<Template_Inline<W_Movable> > b3;
    291  W_NeedyTemplate3<Template_Inline<WS_Movable> > b4;
    292  W_NeedyTemplate3<Template_Inline<SW_Movable> > b5;
    293  W_NeedyTemplate3<Template_Inline<SWS_Movable> > b6;
    294 
    295  W_NeedyTemplate3<Template_Unused<Movable> > c1;
    296  W_NeedyTemplate3<Template_Unused<S_Movable> > c2;
    297  W_NeedyTemplate3<Template_Unused<W_Movable> > c3;
    298  W_NeedyTemplate3<Template_Unused<WS_Movable> > c4;
    299  W_NeedyTemplate3<Template_Unused<SW_Movable> > c5;
    300  W_NeedyTemplate3<Template_Unused<SWS_Movable> > c6;
    301  W_NeedyTemplate3<Template_Unused<NonMovable> > c7;
    302  W_NeedyTemplate3<Template_Unused<S_NonMovable> > c8;
    303  W_NeedyTemplate3<Template_Unused<W_NonMovable> > c9;
    304  W_NeedyTemplate3<Template_Unused<WS_NonMovable> > c10;
    305  W_NeedyTemplate3<Template_Unused<SW_NonMovable> > c11;
    306  W_NeedyTemplate3<Template_Unused<SWS_NonMovable> > c12;
    307 
    308  W_NeedyTemplate3<Template_Ref<Movable> > d1;
    309  W_NeedyTemplate3<Template_Ref<S_Movable> > d2;
    310  W_NeedyTemplate3<Template_Ref<W_Movable> > d3;
    311  W_NeedyTemplate3<Template_Ref<WS_Movable> > d4;
    312  W_NeedyTemplate3<Template_Ref<SW_Movable> > d5;
    313  W_NeedyTemplate3<Template_Ref<SWS_Movable> > d6;
    314  W_NeedyTemplate3<Template_Ref<NonMovable> > d7;
    315  W_NeedyTemplate3<Template_Ref<S_NonMovable> > d8;
    316  W_NeedyTemplate3<Template_Ref<W_NonMovable> > d9;
    317  W_NeedyTemplate3<Template_Ref<WS_NonMovable> > d10;
    318  W_NeedyTemplate3<Template_Ref<SW_NonMovable> > d11;
    319  W_NeedyTemplate3<Template_Ref<SWS_NonMovable> > d12;
    320 }
    321 
    322 //
    323 // 4 - Wrapped Subclassed MOZ_NEEDS_MEMMOVABLE_TYPE
    324 //
    325 
    326 template <class T>
    327 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate4 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate4<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
    328 template <class T>
    329 struct S_NeedyTemplate4 : NeedyTemplate4<T> {}; // expected-note-re 26 {{instantiation of 'NeedyTemplate4<{{.*}}>' requested here}}
    330 template <class T>
    331 struct WS_NeedyTemplate4 {
    332  S_NeedyTemplate4<T> m;
    333 };
    334 void bad4() {
    335  WS_NeedyTemplate4<NonMovable> a1;
    336  WS_NeedyTemplate4<S_NonMovable> a2;
    337  WS_NeedyTemplate4<W_NonMovable> a3;
    338  WS_NeedyTemplate4<WS_NonMovable> a4;
    339  WS_NeedyTemplate4<SW_NonMovable> a5;
    340  WS_NeedyTemplate4<SWS_NonMovable> a6;
    341 
    342  WS_NeedyTemplate4<Template_Inline<NonMovable> > b1;
    343  WS_NeedyTemplate4<Template_Inline<S_NonMovable> > b2;
    344  WS_NeedyTemplate4<Template_Inline<W_NonMovable> > b3;
    345  WS_NeedyTemplate4<Template_Inline<WS_NonMovable> > b4;
    346  WS_NeedyTemplate4<Template_Inline<SW_NonMovable> > b5;
    347  WS_NeedyTemplate4<Template_Inline<SWS_NonMovable> > b6;
    348 
    349  WS_NeedyTemplate4<Template_NonMovable<NonMovable> > c1;
    350  WS_NeedyTemplate4<Template_NonMovable<S_NonMovable> > c2;
    351  WS_NeedyTemplate4<Template_NonMovable<W_NonMovable> > c3;
    352  WS_NeedyTemplate4<Template_NonMovable<WS_NonMovable> > c4;
    353  WS_NeedyTemplate4<Template_NonMovable<SW_NonMovable> > c5;
    354  WS_NeedyTemplate4<Template_NonMovable<SWS_NonMovable> > c6;
    355  WS_NeedyTemplate4<Template_NonMovable<Movable> > c7;
    356  WS_NeedyTemplate4<Template_NonMovable<S_Movable> > c8;
    357  WS_NeedyTemplate4<Template_NonMovable<W_Movable> > c9;
    358  WS_NeedyTemplate4<Template_NonMovable<WS_Movable> > c10;
    359  WS_NeedyTemplate4<Template_NonMovable<SW_Movable> > c11;
    360  WS_NeedyTemplate4<Template_NonMovable<SWS_Movable> > c12;
    361 }
    362 
    363 void good4() {
    364  WS_NeedyTemplate4<Movable> a1;
    365  WS_NeedyTemplate4<S_Movable> a2;
    366  WS_NeedyTemplate4<W_Movable> a3;
    367  WS_NeedyTemplate4<WS_Movable> a4;
    368  WS_NeedyTemplate4<SW_Movable> a5;
    369  WS_NeedyTemplate4<SWS_Movable> a6;
    370 
    371  WS_NeedyTemplate4<Template_Inline<Movable> > b1;
    372  WS_NeedyTemplate4<Template_Inline<S_Movable> > b2;
    373  WS_NeedyTemplate4<Template_Inline<W_Movable> > b3;
    374  WS_NeedyTemplate4<Template_Inline<WS_Movable> > b4;
    375  WS_NeedyTemplate4<Template_Inline<SW_Movable> > b5;
    376  WS_NeedyTemplate4<Template_Inline<SWS_Movable> > b6;
    377 
    378  WS_NeedyTemplate4<Template_Unused<Movable> > c1;
    379  WS_NeedyTemplate4<Template_Unused<S_Movable> > c2;
    380  WS_NeedyTemplate4<Template_Unused<W_Movable> > c3;
    381  WS_NeedyTemplate4<Template_Unused<WS_Movable> > c4;
    382  WS_NeedyTemplate4<Template_Unused<SW_Movable> > c5;
    383  WS_NeedyTemplate4<Template_Unused<SWS_Movable> > c6;
    384  WS_NeedyTemplate4<Template_Unused<NonMovable> > c7;
    385  WS_NeedyTemplate4<Template_Unused<S_NonMovable> > c8;
    386  WS_NeedyTemplate4<Template_Unused<W_NonMovable> > c9;
    387  WS_NeedyTemplate4<Template_Unused<WS_NonMovable> > c10;
    388  WS_NeedyTemplate4<Template_Unused<SW_NonMovable> > c11;
    389  WS_NeedyTemplate4<Template_Unused<SWS_NonMovable> > c12;
    390 
    391  WS_NeedyTemplate4<Template_Ref<Movable> > d1;
    392  WS_NeedyTemplate4<Template_Ref<S_Movable> > d2;
    393  WS_NeedyTemplate4<Template_Ref<W_Movable> > d3;
    394  WS_NeedyTemplate4<Template_Ref<WS_Movable> > d4;
    395  WS_NeedyTemplate4<Template_Ref<SW_Movable> > d5;
    396  WS_NeedyTemplate4<Template_Ref<SWS_Movable> > d6;
    397  WS_NeedyTemplate4<Template_Ref<NonMovable> > d7;
    398  WS_NeedyTemplate4<Template_Ref<S_NonMovable> > d8;
    399  WS_NeedyTemplate4<Template_Ref<W_NonMovable> > d9;
    400  WS_NeedyTemplate4<Template_Ref<WS_NonMovable> > d10;
    401  WS_NeedyTemplate4<Template_Ref<SW_NonMovable> > d11;
    402  WS_NeedyTemplate4<Template_Ref<SWS_NonMovable> > d12;
    403 }
    404 
    405 //
    406 // 5 - Subclassed Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE
    407 //
    408 
    409 template <class T>
    410 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate5 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate5<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
    411 template <class T>
    412 struct W_NeedyTemplate5 {
    413  NeedyTemplate5<T> m; // expected-note-re 26 {{instantiation of 'NeedyTemplate5<{{.*}}>' requested here}}
    414 };
    415 template <class T>
    416 struct SW_NeedyTemplate5 : W_NeedyTemplate5<T> {};
    417 void bad5() {
    418  SW_NeedyTemplate5<NonMovable> a1;
    419  SW_NeedyTemplate5<S_NonMovable> a2;
    420  SW_NeedyTemplate5<W_NonMovable> a3;
    421  SW_NeedyTemplate5<WS_NonMovable> a4;
    422  SW_NeedyTemplate5<SW_NonMovable> a5;
    423  SW_NeedyTemplate5<SWS_NonMovable> a6;
    424 
    425  SW_NeedyTemplate5<Template_Inline<NonMovable> > b1;
    426  SW_NeedyTemplate5<Template_Inline<S_NonMovable> > b2;
    427  SW_NeedyTemplate5<Template_Inline<W_NonMovable> > b3;
    428  SW_NeedyTemplate5<Template_Inline<WS_NonMovable> > b4;
    429  SW_NeedyTemplate5<Template_Inline<SW_NonMovable> > b5;
    430  SW_NeedyTemplate5<Template_Inline<SWS_NonMovable> > b6;
    431 
    432  SW_NeedyTemplate5<Template_NonMovable<NonMovable> > c1;
    433  SW_NeedyTemplate5<Template_NonMovable<S_NonMovable> > c2;
    434  SW_NeedyTemplate5<Template_NonMovable<W_NonMovable> > c3;
    435  SW_NeedyTemplate5<Template_NonMovable<WS_NonMovable> > c4;
    436  SW_NeedyTemplate5<Template_NonMovable<SW_NonMovable> > c5;
    437  SW_NeedyTemplate5<Template_NonMovable<SWS_NonMovable> > c6;
    438  SW_NeedyTemplate5<Template_NonMovable<Movable> > c7;
    439  SW_NeedyTemplate5<Template_NonMovable<S_Movable> > c8;
    440  SW_NeedyTemplate5<Template_NonMovable<W_Movable> > c9;
    441  SW_NeedyTemplate5<Template_NonMovable<WS_Movable> > c10;
    442  SW_NeedyTemplate5<Template_NonMovable<SW_Movable> > c11;
    443  SW_NeedyTemplate5<Template_NonMovable<SWS_Movable> > c12;
    444 }
    445 
    446 void good5() {
    447  SW_NeedyTemplate5<Movable> a1;
    448  SW_NeedyTemplate5<S_Movable> a2;
    449  SW_NeedyTemplate5<W_Movable> a3;
    450  SW_NeedyTemplate5<WS_Movable> a4;
    451  SW_NeedyTemplate5<SW_Movable> a5;
    452  SW_NeedyTemplate5<SWS_Movable> a6;
    453 
    454  SW_NeedyTemplate5<Template_Inline<Movable> > b1;
    455  SW_NeedyTemplate5<Template_Inline<S_Movable> > b2;
    456  SW_NeedyTemplate5<Template_Inline<W_Movable> > b3;
    457  SW_NeedyTemplate5<Template_Inline<WS_Movable> > b4;
    458  SW_NeedyTemplate5<Template_Inline<SW_Movable> > b5;
    459  SW_NeedyTemplate5<Template_Inline<SWS_Movable> > b6;
    460 
    461  SW_NeedyTemplate5<Template_Unused<Movable> > c1;
    462  SW_NeedyTemplate5<Template_Unused<S_Movable> > c2;
    463  SW_NeedyTemplate5<Template_Unused<W_Movable> > c3;
    464  SW_NeedyTemplate5<Template_Unused<WS_Movable> > c4;
    465  SW_NeedyTemplate5<Template_Unused<SW_Movable> > c5;
    466  SW_NeedyTemplate5<Template_Unused<SWS_Movable> > c6;
    467  SW_NeedyTemplate5<Template_Unused<NonMovable> > c7;
    468  SW_NeedyTemplate5<Template_Unused<S_NonMovable> > c8;
    469  SW_NeedyTemplate5<Template_Unused<W_NonMovable> > c9;
    470  SW_NeedyTemplate5<Template_Unused<WS_NonMovable> > c10;
    471  SW_NeedyTemplate5<Template_Unused<SW_NonMovable> > c11;
    472  SW_NeedyTemplate5<Template_Unused<SWS_NonMovable> > c12;
    473 
    474  SW_NeedyTemplate5<Template_Ref<Movable> > d1;
    475  SW_NeedyTemplate5<Template_Ref<S_Movable> > d2;
    476  SW_NeedyTemplate5<Template_Ref<W_Movable> > d3;
    477  SW_NeedyTemplate5<Template_Ref<WS_Movable> > d4;
    478  SW_NeedyTemplate5<Template_Ref<SW_Movable> > d5;
    479  SW_NeedyTemplate5<Template_Ref<SWS_Movable> > d6;
    480  SW_NeedyTemplate5<Template_Ref<NonMovable> > d7;
    481  SW_NeedyTemplate5<Template_Ref<S_NonMovable> > d8;
    482  SW_NeedyTemplate5<Template_Ref<W_NonMovable> > d9;
    483  SW_NeedyTemplate5<Template_Ref<WS_NonMovable> > d10;
    484  SW_NeedyTemplate5<Template_Ref<SW_NonMovable> > d11;
    485  SW_NeedyTemplate5<Template_Ref<SWS_NonMovable> > d12;
    486 }
    487 
    488 //
    489 // 6 - MOZ_NEEDS_MEMMOVABLE_TYPE instantiated with default template argument
    490 //
    491 // Note: This has an extra error, because it also includes a test with the default template argument.
    492 //
    493 
    494 template <class T>
    495 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate6 {T m;}; // expected-error-re 27 {{Cannot instantiate 'NeedyTemplate6<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
    496 template <class T>
    497 struct W_NeedyTemplate6 {
    498  NeedyTemplate6<T> m; // expected-note-re 27 {{instantiation of 'NeedyTemplate6<{{.*}}>' requested here}}
    499 };
    500 template <class T>
    501 struct SW_NeedyTemplate6 : W_NeedyTemplate6<T> {};
    502 // We create a different NonMovable type here, as NeedyTemplate6 will already be instantiated with NonMovable
    503 struct MOZ_NON_MEMMOVABLE NonMovable2 {};
    504 template <class T = NonMovable2>
    505 struct Defaulted_SW_NeedyTemplate6 {
    506  SW_NeedyTemplate6<T> m;
    507 };
    508 void bad6() {
    509  Defaulted_SW_NeedyTemplate6<NonMovable> a1;
    510  Defaulted_SW_NeedyTemplate6<S_NonMovable> a2;
    511  Defaulted_SW_NeedyTemplate6<W_NonMovable> a3;
    512  Defaulted_SW_NeedyTemplate6<WS_NonMovable> a4;
    513  Defaulted_SW_NeedyTemplate6<SW_NonMovable> a5;
    514  Defaulted_SW_NeedyTemplate6<SWS_NonMovable> a6;
    515 
    516  Defaulted_SW_NeedyTemplate6<Template_Inline<NonMovable> > b1;
    517  Defaulted_SW_NeedyTemplate6<Template_Inline<S_NonMovable> > b2;
    518  Defaulted_SW_NeedyTemplate6<Template_Inline<W_NonMovable> > b3;
    519  Defaulted_SW_NeedyTemplate6<Template_Inline<WS_NonMovable> > b4;
    520  Defaulted_SW_NeedyTemplate6<Template_Inline<SW_NonMovable> > b5;
    521  Defaulted_SW_NeedyTemplate6<Template_Inline<SWS_NonMovable> > b6;
    522 
    523  Defaulted_SW_NeedyTemplate6<Template_NonMovable<NonMovable> > c1;
    524  Defaulted_SW_NeedyTemplate6<Template_NonMovable<S_NonMovable> > c2;
    525  Defaulted_SW_NeedyTemplate6<Template_NonMovable<W_NonMovable> > c3;
    526  Defaulted_SW_NeedyTemplate6<Template_NonMovable<WS_NonMovable> > c4;
    527  Defaulted_SW_NeedyTemplate6<Template_NonMovable<SW_NonMovable> > c5;
    528  Defaulted_SW_NeedyTemplate6<Template_NonMovable<SWS_NonMovable> > c6;
    529  Defaulted_SW_NeedyTemplate6<Template_NonMovable<Movable> > c7;
    530  Defaulted_SW_NeedyTemplate6<Template_NonMovable<S_Movable> > c8;
    531  Defaulted_SW_NeedyTemplate6<Template_NonMovable<W_Movable> > c9;
    532  Defaulted_SW_NeedyTemplate6<Template_NonMovable<WS_Movable> > c10;
    533  Defaulted_SW_NeedyTemplate6<Template_NonMovable<SW_Movable> > c11;
    534  Defaulted_SW_NeedyTemplate6<Template_NonMovable<SWS_Movable> > c12;
    535 
    536  Defaulted_SW_NeedyTemplate6<> c13;
    537 }
    538 
    539 void good6() {
    540  Defaulted_SW_NeedyTemplate6<Movable> a1;
    541  Defaulted_SW_NeedyTemplate6<S_Movable> a2;
    542  Defaulted_SW_NeedyTemplate6<W_Movable> a3;
    543  Defaulted_SW_NeedyTemplate6<WS_Movable> a4;
    544  Defaulted_SW_NeedyTemplate6<SW_Movable> a5;
    545  Defaulted_SW_NeedyTemplate6<SWS_Movable> a6;
    546 
    547  Defaulted_SW_NeedyTemplate6<Template_Inline<Movable> > b1;
    548  Defaulted_SW_NeedyTemplate6<Template_Inline<S_Movable> > b2;
    549  Defaulted_SW_NeedyTemplate6<Template_Inline<W_Movable> > b3;
    550  Defaulted_SW_NeedyTemplate6<Template_Inline<WS_Movable> > b4;
    551  Defaulted_SW_NeedyTemplate6<Template_Inline<SW_Movable> > b5;
    552  Defaulted_SW_NeedyTemplate6<Template_Inline<SWS_Movable> > b6;
    553 
    554  Defaulted_SW_NeedyTemplate6<Template_Unused<Movable> > c1;
    555  Defaulted_SW_NeedyTemplate6<Template_Unused<S_Movable> > c2;
    556  Defaulted_SW_NeedyTemplate6<Template_Unused<W_Movable> > c3;
    557  Defaulted_SW_NeedyTemplate6<Template_Unused<WS_Movable> > c4;
    558  Defaulted_SW_NeedyTemplate6<Template_Unused<SW_Movable> > c5;
    559  Defaulted_SW_NeedyTemplate6<Template_Unused<SWS_Movable> > c6;
    560  Defaulted_SW_NeedyTemplate6<Template_Unused<NonMovable> > c7;
    561  Defaulted_SW_NeedyTemplate6<Template_Unused<S_NonMovable> > c8;
    562  Defaulted_SW_NeedyTemplate6<Template_Unused<W_NonMovable> > c9;
    563  Defaulted_SW_NeedyTemplate6<Template_Unused<WS_NonMovable> > c10;
    564  Defaulted_SW_NeedyTemplate6<Template_Unused<SW_NonMovable> > c11;
    565  Defaulted_SW_NeedyTemplate6<Template_Unused<SWS_NonMovable> > c12;
    566 
    567  Defaulted_SW_NeedyTemplate6<Template_Ref<Movable> > d1;
    568  Defaulted_SW_NeedyTemplate6<Template_Ref<S_Movable> > d2;
    569  Defaulted_SW_NeedyTemplate6<Template_Ref<W_Movable> > d3;
    570  Defaulted_SW_NeedyTemplate6<Template_Ref<WS_Movable> > d4;
    571  Defaulted_SW_NeedyTemplate6<Template_Ref<SW_Movable> > d5;
    572  Defaulted_SW_NeedyTemplate6<Template_Ref<SWS_Movable> > d6;
    573  Defaulted_SW_NeedyTemplate6<Template_Ref<NonMovable> > d7;
    574  Defaulted_SW_NeedyTemplate6<Template_Ref<S_NonMovable> > d8;
    575  Defaulted_SW_NeedyTemplate6<Template_Ref<W_NonMovable> > d9;
    576  Defaulted_SW_NeedyTemplate6<Template_Ref<WS_NonMovable> > d10;
    577  Defaulted_SW_NeedyTemplate6<Template_Ref<SW_NonMovable> > d11;
    578  Defaulted_SW_NeedyTemplate6<Template_Ref<SWS_NonMovable> > d12;
    579 }
    580 
    581 //
    582 // 7 - MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument
    583 //
    584 
    585 template <class T>
    586 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate7 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate7<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
    587 template <class T, class Q = NeedyTemplate7<T> >
    588 struct Defaulted_Templated_NeedyTemplate7 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate7<{{.*}}>' requested here}}
    589 void bad7() {
    590  Defaulted_Templated_NeedyTemplate7<NonMovable> a1;
    591  Defaulted_Templated_NeedyTemplate7<S_NonMovable> a2;
    592  Defaulted_Templated_NeedyTemplate7<W_NonMovable> a3;
    593  Defaulted_Templated_NeedyTemplate7<WS_NonMovable> a4;
    594  Defaulted_Templated_NeedyTemplate7<SW_NonMovable> a5;
    595  Defaulted_Templated_NeedyTemplate7<SWS_NonMovable> a6;
    596 
    597  Defaulted_Templated_NeedyTemplate7<Template_Inline<NonMovable> > b1;
    598  Defaulted_Templated_NeedyTemplate7<Template_Inline<S_NonMovable> > b2;
    599  Defaulted_Templated_NeedyTemplate7<Template_Inline<W_NonMovable> > b3;
    600  Defaulted_Templated_NeedyTemplate7<Template_Inline<WS_NonMovable> > b4;
    601  Defaulted_Templated_NeedyTemplate7<Template_Inline<SW_NonMovable> > b5;
    602  Defaulted_Templated_NeedyTemplate7<Template_Inline<SWS_NonMovable> > b6;
    603 
    604  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<NonMovable> > c1;
    605  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<S_NonMovable> > c2;
    606  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<W_NonMovable> > c3;
    607  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<WS_NonMovable> > c4;
    608  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SW_NonMovable> > c5;
    609  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SWS_NonMovable> > c6;
    610  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<Movable> > c7;
    611  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<S_Movable> > c8;
    612  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<W_Movable> > c9;
    613  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<WS_Movable> > c10;
    614  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SW_Movable> > c11;
    615  Defaulted_Templated_NeedyTemplate7<Template_NonMovable<SWS_Movable> > c12;
    616 }
    617 
    618 void good7() {
    619  Defaulted_Templated_NeedyTemplate7<Movable> a1;
    620  Defaulted_Templated_NeedyTemplate7<S_Movable> a2;
    621  Defaulted_Templated_NeedyTemplate7<W_Movable> a3;
    622  Defaulted_Templated_NeedyTemplate7<WS_Movable> a4;
    623  Defaulted_Templated_NeedyTemplate7<SW_Movable> a5;
    624  Defaulted_Templated_NeedyTemplate7<SWS_Movable> a6;
    625 
    626  Defaulted_Templated_NeedyTemplate7<Template_Inline<Movable> > b1;
    627  Defaulted_Templated_NeedyTemplate7<Template_Inline<S_Movable> > b2;
    628  Defaulted_Templated_NeedyTemplate7<Template_Inline<W_Movable> > b3;
    629  Defaulted_Templated_NeedyTemplate7<Template_Inline<WS_Movable> > b4;
    630  Defaulted_Templated_NeedyTemplate7<Template_Inline<SW_Movable> > b5;
    631  Defaulted_Templated_NeedyTemplate7<Template_Inline<SWS_Movable> > b6;
    632 
    633  Defaulted_Templated_NeedyTemplate7<Template_Unused<Movable> > c1;
    634  Defaulted_Templated_NeedyTemplate7<Template_Unused<S_Movable> > c2;
    635  Defaulted_Templated_NeedyTemplate7<Template_Unused<W_Movable> > c3;
    636  Defaulted_Templated_NeedyTemplate7<Template_Unused<WS_Movable> > c4;
    637  Defaulted_Templated_NeedyTemplate7<Template_Unused<SW_Movable> > c5;
    638  Defaulted_Templated_NeedyTemplate7<Template_Unused<SWS_Movable> > c6;
    639  Defaulted_Templated_NeedyTemplate7<Template_Unused<NonMovable> > c7;
    640  Defaulted_Templated_NeedyTemplate7<Template_Unused<S_NonMovable> > c8;
    641  Defaulted_Templated_NeedyTemplate7<Template_Unused<W_NonMovable> > c9;
    642  Defaulted_Templated_NeedyTemplate7<Template_Unused<WS_NonMovable> > c10;
    643  Defaulted_Templated_NeedyTemplate7<Template_Unused<SW_NonMovable> > c11;
    644  Defaulted_Templated_NeedyTemplate7<Template_Unused<SWS_NonMovable> > c12;
    645 
    646  Defaulted_Templated_NeedyTemplate7<Template_Ref<Movable> > d1;
    647  Defaulted_Templated_NeedyTemplate7<Template_Ref<S_Movable> > d2;
    648  Defaulted_Templated_NeedyTemplate7<Template_Ref<W_Movable> > d3;
    649  Defaulted_Templated_NeedyTemplate7<Template_Ref<WS_Movable> > d4;
    650  Defaulted_Templated_NeedyTemplate7<Template_Ref<SW_Movable> > d5;
    651  Defaulted_Templated_NeedyTemplate7<Template_Ref<SWS_Movable> > d6;
    652  Defaulted_Templated_NeedyTemplate7<Template_Ref<NonMovable> > d7;
    653  Defaulted_Templated_NeedyTemplate7<Template_Ref<S_NonMovable> > d8;
    654  Defaulted_Templated_NeedyTemplate7<Template_Ref<W_NonMovable> > d9;
    655  Defaulted_Templated_NeedyTemplate7<Template_Ref<WS_NonMovable> > d10;
    656  Defaulted_Templated_NeedyTemplate7<Template_Ref<SW_NonMovable> > d11;
    657  Defaulted_Templated_NeedyTemplate7<Template_Ref<SWS_NonMovable> > d12;
    658 }
    659 
    660 //
    661 // 8 - Wrapped MOZ_NEEDS_MEMMOVABLE_TYPE instantiated as default template argument
    662 //
    663 
    664 template <class T>
    665 struct MOZ_NEEDS_MEMMOVABLE_TYPE NeedyTemplate8 {T m;}; // expected-error-re 26 {{Cannot instantiate 'NeedyTemplate8<{{.*}}>' with non-memmovable template argument '{{.*}}'}}
    666 template <class T, class Q = NeedyTemplate8<T> >
    667 struct Defaulted_Templated_NeedyTemplate8 {Q m;}; // expected-note-re 26 {{instantiation of 'NeedyTemplate8<{{.*}}>' requested here}}
    668 template <class T>
    669 struct W_Defaulted_Templated_NeedyTemplate8 {
    670  Defaulted_Templated_NeedyTemplate8<T> m;
    671 };
    672 void bad8() {
    673  W_Defaulted_Templated_NeedyTemplate8<NonMovable> a1;
    674  W_Defaulted_Templated_NeedyTemplate8<S_NonMovable> a2;
    675  W_Defaulted_Templated_NeedyTemplate8<W_NonMovable> a3;
    676  W_Defaulted_Templated_NeedyTemplate8<WS_NonMovable> a4;
    677  W_Defaulted_Templated_NeedyTemplate8<SW_NonMovable> a5;
    678  W_Defaulted_Templated_NeedyTemplate8<SWS_NonMovable> a6;
    679 
    680  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<NonMovable> > b1;
    681  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<S_NonMovable> > b2;
    682  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<W_NonMovable> > b3;
    683  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<WS_NonMovable> > b4;
    684  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SW_NonMovable> > b5;
    685  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SWS_NonMovable> > b6;
    686 
    687  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<NonMovable> > c1;
    688  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<S_NonMovable> > c2;
    689  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<W_NonMovable> > c3;
    690  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<WS_NonMovable> > c4;
    691  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SW_NonMovable> > c5;
    692  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SWS_NonMovable> > c6;
    693  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<Movable> > c7;
    694  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<S_Movable> > c8;
    695  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<W_Movable> > c9;
    696  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<WS_Movable> > c10;
    697  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SW_Movable> > c11;
    698  W_Defaulted_Templated_NeedyTemplate8<Template_NonMovable<SWS_Movable> > c12;
    699 }
    700 
    701 void good8() {
    702  W_Defaulted_Templated_NeedyTemplate8<Movable> a1;
    703  W_Defaulted_Templated_NeedyTemplate8<S_Movable> a2;
    704  W_Defaulted_Templated_NeedyTemplate8<W_Movable> a3;
    705  W_Defaulted_Templated_NeedyTemplate8<WS_Movable> a4;
    706  W_Defaulted_Templated_NeedyTemplate8<SW_Movable> a5;
    707  W_Defaulted_Templated_NeedyTemplate8<SWS_Movable> a6;
    708 
    709  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<Movable> > b1;
    710  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<S_Movable> > b2;
    711  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<W_Movable> > b3;
    712  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<WS_Movable> > b4;
    713  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SW_Movable> > b5;
    714  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SWS_Movable> > b6;
    715 
    716  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<Movable> > c1;
    717  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<S_Movable> > c2;
    718  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<W_Movable> > c3;
    719  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<WS_Movable> > c4;
    720  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SW_Movable> > c5;
    721  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SWS_Movable> > c6;
    722  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<NonMovable> > c7;
    723  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<S_NonMovable> > c8;
    724  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<W_NonMovable> > c9;
    725  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<WS_NonMovable> > c10;
    726  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SW_NonMovable> > c11;
    727  W_Defaulted_Templated_NeedyTemplate8<Template_Unused<SWS_NonMovable> > c12;
    728 
    729  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<Movable> > d1;
    730  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<S_Movable> > d2;
    731  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<W_Movable> > d3;
    732  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<WS_Movable> > d4;
    733  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SW_Movable> > d5;
    734  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SWS_Movable> > d6;
    735  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<NonMovable> > d7;
    736  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<S_NonMovable> > d8;
    737  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<W_NonMovable> > d9;
    738  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<WS_NonMovable> > d10;
    739  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SW_NonMovable> > d11;
    740  W_Defaulted_Templated_NeedyTemplate8<Template_Ref<SWS_NonMovable> > d12;
    741 }
    742 
    743 /*
    744  SpecializedNonMovable is a non-movable class which has an explicit specialization of NeedyTemplate
    745  for it. Instantiations of NeedyTemplateN<SpecializedNonMovable> should be legal as the explicit
    746  specialization isn't annotated with MOZ_NEEDS_MEMMOVABLE_TYPE.
    747 
    748  However, as it is MOZ_NON_MEMMOVABLE, derived classes and members shouldn't be able to be used to
    749  instantiate NeedyTemplate.
    750 */
    751 
    752 struct MOZ_NON_MEMMOVABLE SpecializedNonMovable {};
    753 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'}}
    754 
    755 // Specialize all of the NeedyTemplates with SpecializedNonMovable.
    756 template <>
    757 struct NeedyTemplate1<SpecializedNonMovable> {};
    758 template <>
    759 struct NeedyTemplate2<SpecializedNonMovable> {};
    760 template <>
    761 struct NeedyTemplate3<SpecializedNonMovable> {};
    762 template <>
    763 struct NeedyTemplate4<SpecializedNonMovable> {};
    764 template <>
    765 struct NeedyTemplate5<SpecializedNonMovable> {};
    766 template <>
    767 struct NeedyTemplate6<SpecializedNonMovable> {};
    768 template <>
    769 struct NeedyTemplate7<SpecializedNonMovable> {};
    770 template <>
    771 struct NeedyTemplate8<SpecializedNonMovable> {};
    772 
    773 void specialization() {
    774  /*
    775    SpecializedNonMovable has a specialization for every variant of NeedyTemplate,
    776    so these templates are valid, even though SpecializedNonMovable isn't
    777    memmovable
    778  */
    779  NeedyTemplate1<SpecializedNonMovable> a1;
    780  S_NeedyTemplate2<SpecializedNonMovable> a2;
    781  W_NeedyTemplate3<SpecializedNonMovable> a3;
    782  WS_NeedyTemplate4<SpecializedNonMovable> a4;
    783  SW_NeedyTemplate5<SpecializedNonMovable> a5;
    784  Defaulted_SW_NeedyTemplate6<SpecializedNonMovable> a6;
    785  Defaulted_Templated_NeedyTemplate7<SpecializedNonMovable> a7;
    786  W_Defaulted_Templated_NeedyTemplate8<SpecializedNonMovable> a8;
    787 
    788  /*
    789    These entries contain an element which is SpecializedNonMovable, and are non-movable
    790    as there is no valid specialization, and their member is non-memmovable
    791  */
    792  NeedyTemplate1<Template_Inline<SpecializedNonMovable> > b1;  // expected-note-re {{instantiation of 'NeedyTemplate1<Template_Inline<SpecializedNonMovable>{{ ?}}>' requested here}}
    793  S_NeedyTemplate2<Template_Inline<SpecializedNonMovable> > b2;
    794  W_NeedyTemplate3<Template_Inline<SpecializedNonMovable> > b3;
    795  WS_NeedyTemplate4<Template_Inline<SpecializedNonMovable> > b4;
    796  SW_NeedyTemplate5<Template_Inline<SpecializedNonMovable> > b5;
    797  Defaulted_SW_NeedyTemplate6<Template_Inline<SpecializedNonMovable> > b6;
    798  Defaulted_Templated_NeedyTemplate7<Template_Inline<SpecializedNonMovable> > b7;
    799  W_Defaulted_Templated_NeedyTemplate8<Template_Inline<SpecializedNonMovable> > b8;
    800 
    801  /*
    802    The subclass of SpecializedNonMovable, is also non-memmovable,
    803    as there is no valid specialization.
    804  */
    805  NeedyTemplate1<S_SpecializedNonMovable> c1; // expected-note {{instantiation of 'NeedyTemplate1<S_SpecializedNonMovable>' requested here}}
    806  S_NeedyTemplate2<S_SpecializedNonMovable> c2;
    807  W_NeedyTemplate3<S_SpecializedNonMovable> c3;
    808  WS_NeedyTemplate4<S_SpecializedNonMovable> c4;
    809  SW_NeedyTemplate5<S_SpecializedNonMovable> c5;
    810  Defaulted_SW_NeedyTemplate6<S_SpecializedNonMovable> c6;
    811  Defaulted_Templated_NeedyTemplate7<S_SpecializedNonMovable> c7;
    812  W_Defaulted_Templated_NeedyTemplate8<S_SpecializedNonMovable> c8;
    813 }
    814 
    815 class MOZ_NEEDS_MEMMOVABLE_MEMBERS NeedsMemMovableMembers {
    816  Movable m1;
    817  NonMovable m2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'm2' of type 'NonMovable'}}
    818  S_Movable sm1;
    819  S_NonMovable sm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'sm2' of type 'S_NonMovable'}}
    820  W_Movable wm1;
    821  W_NonMovable wm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'wm2' of type 'W_NonMovable'}}
    822  SW_Movable swm1;
    823  SW_NonMovable swm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'swm2' of type 'SW_NonMovable'}}
    824  WS_Movable wsm1;
    825  WS_NonMovable wsm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'wsm2' of type 'WS_NonMovable'}}
    826  SWS_Movable swsm1;
    827  SWS_NonMovable swsm2; // expected-error {{class 'NeedsMemMovableMembers' cannot have non-memmovable member 'swsm2' of type 'SWS_NonMovable'}}
    828 };
    829 
    830 class NeedsMemMovableMembersDerived : public NeedsMemMovableMembers {};