mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-03 16:16:05 +00:00
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<
|
def err_unexpanded_parameter_pack_0 : Error<
|
||||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||||
"size|static assertion|fixed underlying type|enumerator value|"
|
"size|static assertion|fixed underlying type|enumerator value|"
|
||||||
"using declaration}0 "
|
"using declaration|friend declaration|qualifier}0 "
|
||||||
"contains an unexpanded parameter pack">;
|
"contains an unexpanded parameter pack">;
|
||||||
def err_unexpanded_parameter_pack_1 : Error<
|
def err_unexpanded_parameter_pack_1 : Error<
|
||||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||||
"size|static assertion|fixed underlying type|enumerator value|"
|
"size|static assertion|fixed underlying type|enumerator value|"
|
||||||
"using declaration}0 "
|
"using declaration|friend declaration|qualifier}0 "
|
||||||
"contains unexpanded parameter pack %1">;
|
"contains unexpanded parameter pack %1">;
|
||||||
def err_unexpanded_parameter_pack_2 : Error<
|
def err_unexpanded_parameter_pack_2 : Error<
|
||||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||||
"size|static assertion|fixed underlying type|enumerator value|"
|
"size|static assertion|fixed underlying type|enumerator value|"
|
||||||
"using declaration}0 "
|
"using declaration|friend declaration|qualifier}0 "
|
||||||
"contains unexpanded parameter packs %1 and %2">;
|
"contains unexpanded parameter packs %1 and %2">;
|
||||||
def err_unexpanded_parameter_pack_3_or_more : Error<
|
def err_unexpanded_parameter_pack_3_or_more : Error<
|
||||||
"%select{expression|base type|declaration type|data member type|bit-field "
|
"%select{expression|base type|declaration type|data member type|bit-field "
|
||||||
"size|static assertion|fixed underlying type|enumerator value|"
|
"size|static assertion|fixed underlying type|enumerator value|"
|
||||||
"using declaration}0 "
|
"using declaration|friend declaration|qualifier}0 "
|
||||||
"contains unexpanded parameter packs %1, %2, ...">;
|
"contains unexpanded parameter packs %1, %2, ...">;
|
||||||
|
|
||||||
def err_unexpected_typedef : Error<
|
def err_unexpected_typedef : Error<
|
||||||
|
@ -3160,7 +3160,13 @@ public:
|
|||||||
UPPC_EnumeratorValue,
|
UPPC_EnumeratorValue,
|
||||||
|
|
||||||
/// \brief A using declaration.
|
/// \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,
|
/// \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())
|
if (D.getCXXScopeSpec().isInvalid())
|
||||||
D.setInvalidType();
|
D.setInvalidType();
|
||||||
else if (D.getCXXScopeSpec().isSet()) {
|
else if (D.getCXXScopeSpec().isSet()) {
|
||||||
|
if (DiagnoseUnexpandedParameterPack(D.getCXXScopeSpec(),
|
||||||
|
UPPC_DeclarationQualifier))
|
||||||
|
return 0;
|
||||||
|
|
||||||
bool EnteringContext = !D.getDeclSpec().isFriendSpecified();
|
bool EnteringContext = !D.getDeclSpec().isFriendSpecified();
|
||||||
DC = computeDeclContext(D.getCXXScopeSpec(), EnteringContext);
|
DC = computeDeclContext(D.getCXXScopeSpec(), EnteringContext);
|
||||||
if (!DC) {
|
if (!DC) {
|
||||||
|
@ -6383,6 +6383,9 @@ Decl *Sema::ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
|
|||||||
if (TheDeclarator.isInvalidType())
|
if (TheDeclarator.isInvalidType())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (DiagnoseUnexpandedParameterPack(Loc, TSI, UPPC_FriendDeclaration))
|
||||||
|
return 0;
|
||||||
|
|
||||||
// This is definitely an error in C++98. It's probably meant to
|
// This is definitely an error in C++98. It's probably meant to
|
||||||
// be forbidden in C++0x, too, but the specification is just
|
// be forbidden in C++0x, too, but the specification is just
|
||||||
// poorly written.
|
// poorly written.
|
||||||
@ -6482,6 +6485,12 @@ Decl *Sema::ActOnFriendFunctionDecl(Scope *S, Declarator &D, bool IsDefinition,
|
|||||||
DeclarationName Name = NameInfo.getName();
|
DeclarationName Name = NameInfo.getName();
|
||||||
assert(Name);
|
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
|
// The context we found the declaration in, or in which we should
|
||||||
// create the declaration.
|
// create the declaration.
|
||||||
DeclContext *DC;
|
DeclContext *DC;
|
||||||
|
@ -121,6 +121,10 @@ struct TestUnexpandedDecls : T{
|
|||||||
using typename Types::type; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
|
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 Types::value; // expected-error{{using declaration contains unexpanded parameter pack 'Types'}}
|
||||||
using T::operator Types; // 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
|
// Test for diagnostics in the presence of multiple unexpanded
|
||||||
|
Loading…
x
Reference in New Issue
Block a user