@@ -591,6 +591,9 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
591
591
bool SawDefaultArgument = false ;
592
592
SourceLocation PreviousDefaultArgLoc;
593
593
594
+ bool SawParameterPack = false ;
595
+ SourceLocation ParameterPackLoc;
596
+
594
597
// Dummy initialization to avoid warnings.
595
598
TemplateParameterList::iterator OldParam = NewParams->end ();
596
599
if (OldParams)
@@ -607,13 +610,27 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
607
610
// Variables used to diagnose missing default arguments
608
611
bool MissingDefaultArg = false ;
609
612
613
+ // C++0x [temp.param]p11:
614
+ // If a template parameter of a class template is a template parameter pack,
615
+ // it must be the last template parameter.
616
+ if (SawParameterPack) {
617
+ Diag (ParameterPackLoc,
618
+ diag::err_template_param_pack_must_be_last_template_parameter);
619
+ Invalid = true ;
620
+ }
621
+
610
622
// Merge default arguments for template type parameters.
611
623
if (TemplateTypeParmDecl *NewTypeParm
612
624
= dyn_cast<TemplateTypeParmDecl>(*NewParam)) {
613
625
TemplateTypeParmDecl *OldTypeParm
614
626
= OldParams? cast<TemplateTypeParmDecl>(*OldParam) : 0 ;
615
627
616
- if (OldTypeParm && OldTypeParm->hasDefaultArgument () &&
628
+ if (NewTypeParm->isParameterPack ()) {
629
+ assert (!NewTypeParm->hasDefaultArgument () &&
630
+ " Parameter packs can't have a default argument!" );
631
+ SawParameterPack = true ;
632
+ ParameterPackLoc = NewTypeParm->getLocation ();
633
+ } else if (OldTypeParm && OldTypeParm->hasDefaultArgument () &&
617
634
NewTypeParm->hasDefaultArgument ()) {
618
635
OldDefaultLoc = OldTypeParm->getDefaultArgumentLoc ();
619
636
NewDefaultLoc = NewTypeParm->getDefaultArgumentLoc ();
0 commit comments