forked from OSchip/llvm-project
Implement DR21
A default template-argument shall not be specified in a friend template declaration. Interestingly, we properly handled default template arguments on friend class members but not on just friend classes. llvm-svn: 184882
This commit is contained in:
parent
6e630d46d2
commit
ba8f17ac10
|
@ -4938,6 +4938,7 @@ public:
|
|||
TPC_ClassTemplate,
|
||||
TPC_FunctionTemplate,
|
||||
TPC_ClassTemplateMember,
|
||||
TPC_FriendClassTemplate,
|
||||
TPC_FriendFunctionTemplate,
|
||||
TPC_FriendFunctionTemplateDefinition,
|
||||
TPC_TypeAliasTemplate
|
||||
|
|
|
@ -1033,13 +1033,14 @@ Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK,
|
|||
// template declaration. Skip this check for a friend in a dependent
|
||||
// context, because the template parameter list might be dependent.
|
||||
if (!(TUK == TUK_Friend && CurContext->isDependentContext()) &&
|
||||
CheckTemplateParameterList(TemplateParams,
|
||||
PrevClassTemplate? PrevClassTemplate->getTemplateParameters() : 0,
|
||||
(SS.isSet() && SemanticContext &&
|
||||
SemanticContext->isRecord() &&
|
||||
SemanticContext->isDependentContext())
|
||||
? TPC_ClassTemplateMember
|
||||
: TPC_ClassTemplate))
|
||||
CheckTemplateParameterList(
|
||||
TemplateParams,
|
||||
PrevClassTemplate ? PrevClassTemplate->getTemplateParameters() : 0,
|
||||
(SS.isSet() && SemanticContext && SemanticContext->isRecord() &&
|
||||
SemanticContext->isDependentContext())
|
||||
? TPC_ClassTemplateMember
|
||||
: TUK == TUK_Friend ? TPC_FriendClassTemplate
|
||||
: TPC_ClassTemplate))
|
||||
Invalid = true;
|
||||
|
||||
if (SS.isSet()) {
|
||||
|
@ -1187,6 +1188,7 @@ static bool DiagnoseDefaultTemplateArgument(Sema &S,
|
|||
<< DefArgRange;
|
||||
return true;
|
||||
|
||||
case Sema::TPC_FriendClassTemplate:
|
||||
case Sema::TPC_FriendFunctionTemplate:
|
||||
// C++ [temp.param]p9:
|
||||
// A default template-argument shall not be specified in a
|
||||
|
|
|
@ -223,12 +223,11 @@ namespace dr20 { // dr20: yes
|
|||
X x = f(); // expected-error {{private}}
|
||||
}
|
||||
|
||||
namespace dr21 { // dr21: no
|
||||
namespace dr21 { // dr21: yes
|
||||
template<typename T> struct A;
|
||||
struct X {
|
||||
// FIXME: We should reject these, per [temp.param]p9.
|
||||
template<typename T = int> friend struct A;
|
||||
template<typename T = int> friend struct B;
|
||||
template<typename T = int> friend struct A; // expected-error {{default template argument not permitted on a friend template}}
|
||||
template<typename T = int> friend struct B; // expected-error {{default template argument not permitted on a friend template}}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@
|
|||
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#21">21</a></td>
|
||||
<td>TC1</td>
|
||||
<td>Can a default argument for a template parameter appear in a friend declaration?</td>
|
||||
<td class="none" align="center">No</td>
|
||||
<td class="full" align="center">Yes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#22">22</a></td>
|
||||
|
|
Loading…
Reference in New Issue