mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-12 09:41:26 +00:00
When we're checking a friend function template in an out-of-line class
definition, we may not have a scope corresponding to the namespace where that friend function template actually lives. Work around this issue by faking up a scope with the appropriate DeclContext. This is a bit of a hack, but it fixes <rdar://problem/10204947>. llvm-svn: 143614
This commit is contained in:
parent
f82d8064d4
commit
dd847baadd
@ -10050,7 +10050,7 @@ Decl *Sema::ActOnFriendFunctionDecl(Scope *S, Declarator &D,
|
||||
diag::err_friend_is_member);
|
||||
|
||||
DCScope = getScopeForDeclContext(S, DC);
|
||||
|
||||
|
||||
// C++ [class.friend]p6:
|
||||
// A function can be defined in a friend declaration of a class if and
|
||||
// only if the class is a non-local class (9.8), the function name is
|
||||
@ -10142,6 +10142,15 @@ Decl *Sema::ActOnFriendFunctionDecl(Scope *S, Declarator &D,
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: This is an egregious hack to cope with cases where the scope stack
|
||||
// does not contain the declaration context, i.e., in an out-of-line
|
||||
// definition of a class.
|
||||
Scope FakeDCScope(S, Scope::DeclScope, Diags);
|
||||
if (!DCScope) {
|
||||
FakeDCScope.setEntity(DC);
|
||||
DCScope = &FakeDCScope;
|
||||
}
|
||||
|
||||
bool AddToScope = true;
|
||||
NamedDecl *ND = ActOnFunctionDeclarator(DCScope, D, DC, TInfo, Previous,
|
||||
move(TemplateParams), AddToScope);
|
||||
|
@ -4455,6 +4455,9 @@ Sema::TemplateParameterListsAreEqual(TemplateParameterList *New,
|
||||
/// false. Otherwise, issues a diagnostic and returns true.
|
||||
bool
|
||||
Sema::CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams) {
|
||||
if (!S)
|
||||
return false;
|
||||
|
||||
// Find the nearest enclosing declaration scope.
|
||||
while ((S->getFlags() & Scope::DeclScope) == 0 ||
|
||||
(S->getFlags() & Scope::TemplateParamScope) != 0)
|
||||
|
12
clang/test/SemaCXX/friend-out-of-line.cpp
Normal file
12
clang/test/SemaCXX/friend-out-of-line.cpp
Normal file
@ -0,0 +1,12 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
// <rdar://problem/10204947>
|
||||
namespace N {
|
||||
class X;
|
||||
};
|
||||
|
||||
class N::X {
|
||||
template<typename T> friend const T& f(const X&);
|
||||
friend const int& g(const X&);
|
||||
friend class Y;
|
||||
};
|
Loading…
Reference in New Issue
Block a user