forked from OSchip/llvm-project
Check for unexpanded parameter packs in friend declarations.
llvm-svn: 121934
This commit is contained in:
parent
7cabbe04eb
commit
6c110f385b
|
@ -1824,22 +1824,22 @@ def note_template_parameter_pack_here : Note<
|
|||
def err_unexpanded_parameter_pack_0 : Error<
|
||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||
"size|static assertion|fixed underlying type|enumerator value|"
|
||||
"using declaration}0 "
|
||||
"using declaration|friend declaration|qualifier}0 "
|
||||
"contains an unexpanded parameter pack">;
|
||||
def err_unexpanded_parameter_pack_1 : Error<
|
||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||
"size|static assertion|fixed underlying type|enumerator value|"
|
||||
"using declaration}0 "
|
||||
"using declaration|friend declaration|qualifier}0 "
|
||||
"contains unexpanded parameter pack %1">;
|
||||
def err_unexpanded_parameter_pack_2 : Error<
|
||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||
"size|static assertion|fixed underlying type|enumerator value|"
|
||||
"using declaration}0 "
|
||||
"using declaration|friend declaration|qualifier}0 "
|
||||
"contains unexpanded parameter packs %1 and %2">;
|
||||
def err_unexpanded_parameter_pack_3_or_more : Error<
|
||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||
"size|static assertion|fixed underlying type|enumerator value|"
|
||||
"using declaration}0 "
|
||||
"using declaration|friend declaration|qualifier}0 "
|
||||
"contains unexpanded parameter packs %1, %2, ...">;
|
||||
|
||||
def err_unexpected_typedef : Error<
|
||||
|
|
|
@ -3160,7 +3160,13 @@ public:
|
|||
UPPC_EnumeratorValue,
|
||||
|
||||
/// \brief A using declaration.
|
||||
UPPC_UsingDeclaration
|
||||
UPPC_UsingDeclaration,
|
||||
|
||||
/// \brief A friend declaration.
|
||||
UPPC_FriendDeclaration,
|
||||
|
||||
/// \brief A declaration qualifier.
|
||||
UPPC_DeclarationQualifier
|
||||
};
|
||||
|
||||
/// \brief If the given type contains an unexpanded parameter pack,
|
||||
|
|
|
@ -2332,6 +2332,10 @@ Decl *Sema::HandleDeclarator(Scope *S, Declarator &D,
|
|||
if (D.getCXXScopeSpec().isInvalid())
|
||||
D.setInvalidType();
|
||||
else if (D.getCXXScopeSpec().isSet()) {
|
||||
if (DiagnoseUnexpandedParameterPack(D.getCXXScopeSpec(),
|
||||
UPPC_DeclarationQualifier))
|
||||
return 0;
|
||||
|
||||
bool EnteringContext = !D.getDeclSpec().isFriendSpecified();
|
||||
DC = computeDeclContext(D.getCXXScopeSpec(), EnteringContext);
|
||||
if (!DC) {
|
||||
|
|
|
@ -6383,6 +6383,9 @@ Decl *Sema::ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
|
|||
if (TheDeclarator.isInvalidType())
|
||||
return 0;
|
||||
|
||||
if (DiagnoseUnexpandedParameterPack(Loc, TSI, UPPC_FriendDeclaration))
|
||||
return 0;
|
||||
|
||||
// This is definitely an error in C++98. It's probably meant to
|
||||
// be forbidden in C++0x, too, but the specification is just
|
||||
// poorly written.
|
||||
|
@ -6482,6 +6485,12 @@ Decl *Sema::ActOnFriendFunctionDecl(Scope *S, Declarator &D, bool IsDefinition,
|
|||
DeclarationName Name = NameInfo.getName();
|
||||
assert(Name);
|
||||
|
||||
// Check for unexpanded parameter packs.
|
||||
if (DiagnoseUnexpandedParameterPack(Loc, TInfo, UPPC_FriendDeclaration) ||
|
||||
DiagnoseUnexpandedParameterPack(NameInfo, UPPC_FriendDeclaration) ||
|
||||
DiagnoseUnexpandedParameterPack(SS, UPPC_FriendDeclaration))
|
||||
return 0;
|
||||
|
||||
// The context we found the declaration in, or in which we should
|
||||
// create the declaration.
|
||||
DeclContext *DC;
|
||||
|
|
|
@ -121,6 +121,10 @@ struct TestUnexpandedDecls : T{
|
|||
using typename Types::type; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
|
||||
using Types::value; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
|
||||
using T::operator Types; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
|
||||
|
||||
friend class Types::foo; // expected-error{{friend declaration contains unexpanded parameter pack 'Types'}}
|
||||
friend void friend_func(Types); // expected-error{{friend declaration contains unexpanded parameter pack 'Types'}}
|
||||
friend void Types::other_friend_func(int); // expected-error{{friend declaration contains unexpanded parameter pack 'Types'}}
|
||||
};
|
||||
|
||||
// Test for diagnostics in the presence of multiple unexpanded
|
||||
|
|
Loading…
Reference in New Issue