[cfe-commits] r99601 - in /cfe/trunk: lib/Sema/SemaAccess.cpp lib/Sema/SemaTemplateInstantiateDecl.cpp test/CXX/temp/temp.decls/temp.friend/p1.cpp
John McCall
rjmccall at apple.com
Thu Mar 25 19:38:45 PDT 2010
Author: rjmccall
Date: Thu Mar 25 21:38:45 2010
New Revision: 99601
URL: http://llvm.org/viewvc/llvm-project?rev=99601&view=rev
Log:
Apparently that didn't work. Reverting for now.
Modified:
cfe/trunk/lib/Sema/SemaAccess.cpp
cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp
Modified: cfe/trunk/lib/Sema/SemaAccess.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaAccess.cpp?rev=99601&r1=99600&r2=99601&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaAccess.cpp (original)
+++ cfe/trunk/lib/Sema/SemaAccess.cpp Thu Mar 25 21:38:45 2010
@@ -319,7 +319,7 @@
if (Friend == FTD->getCanonicalDecl())
return Sema::AR_accessible;
- if (EC.isDependent() && MightInstantiateTo(S, FTD, Friend))
+ if (MightInstantiateTo(S, FTD, Friend))
return Sema::AR_dependent;
return Sema::AR_inaccessible;
Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=99601&r1=99600&r2=99601&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Thu Mar 25 21:38:45 2010
@@ -904,15 +904,8 @@
// Check whether there is already a function template specialization for
// this declaration.
FunctionTemplateDecl *FunctionTemplate = D->getDescribedFunctionTemplate();
-
- bool isFriend;
- if (FunctionTemplate)
- isFriend = (FunctionTemplate->getFriendObjectKind() != Decl::FOK_None);
- else
- isFriend = (D->getFriendObjectKind() != Decl::FOK_None);
-
void *InsertPos = 0;
- if (!isFriend && FunctionTemplate && !TemplateParams) {
+ if (FunctionTemplate && !TemplateParams) {
llvm::FoldingSetNodeID ID;
FunctionTemplateSpecializationInfo::Profile(ID,
TemplateArgs.getInnermost().getFlatArgumentList(),
@@ -940,29 +933,14 @@
return 0;
QualType T = TInfo->getType();
- NestedNameSpecifier *Qualifier = D->getQualifier();
- if (Qualifier) {
- Qualifier = SemaRef.SubstNestedNameSpecifier(Qualifier,
- D->getQualifierRange(),
- TemplateArgs);
- if (!Qualifier) return 0;
- }
-
// If we're instantiating a local function declaration, put the result
// in the owner; otherwise we need to find the instantiated context.
DeclContext *DC;
if (D->getDeclContext()->isFunctionOrMethod())
DC = Owner;
- else if (isFriend && Qualifier) {
- CXXScopeSpec SS;
- SS.setScopeRep(Qualifier);
- SS.setRange(D->getQualifierRange());
- DC = SemaRef.computeDeclContext(SS);
- if (!DC) return 0;
- } else {
+ else
DC = SemaRef.FindInstantiatedContext(D->getLocation(), D->getDeclContext(),
TemplateArgs);
- }
FunctionDecl *Function =
FunctionDecl::Create(SemaRef.Context, DC, D->getLocation(),
@@ -970,8 +948,9 @@
D->getStorageClass(),
D->isInlineSpecified(), D->hasWrittenPrototype());
- if (Qualifier)
- Function->setQualifierInfo(Qualifier, D->getQualifierRange());
+ // Substitute the nested name specifier, if any.
+ if (SubstQualifier(D, Function))
+ return 0;
Function->setLexicalDeclContext(Owner);
@@ -995,7 +974,7 @@
// which means substituting int for T, but leaving "f" as a friend function
// template.
// Build the function template itself.
- FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, DC,
+ FunctionTemplate = FunctionTemplateDecl::Create(SemaRef.Context, Owner,
Function->getLocation(),
Function->getDeclName(),
TemplateParams, Function);
@@ -1037,7 +1016,9 @@
// If the original function was part of a friend declaration,
// inherit its namespace state and add it to the owner.
- if (isFriend) {
+ NamedDecl *FromFriendD
+ = TemplateParams? cast<NamedDecl>(D->getDescribedFunctionTemplate()) : D;
+ if (FromFriendD->getFriendObjectKind()) {
NamedDecl *ToFriendD = 0;
NamedDecl *PrevDecl;
if (TemplateParams) {
@@ -1048,7 +1029,11 @@
PrevDecl = Function->getPreviousDeclaration();
}
ToFriendD->setObjectOfFriendDecl(PrevDecl != NULL);
- DC->makeDeclVisibleInContext(ToFriendD, /*Recoverable=*/ false);
+ if (!Owner->isDependentContext() && !PrevDecl)
+ DC->makeDeclVisibleInContext(ToFriendD, /* Recoverable = */ false);
+
+ if (!TemplateParams)
+ Function->setInstantiationOfMemberFunction(D, TSK_ImplicitInstantiation);
}
return Function;
Modified: cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp?rev=99601&r1=99600&r2=99601&view=diff
==============================================================================
--- cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp (original)
+++ cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp Thu Mar 25 21:38:45 2010
@@ -178,16 +178,3 @@
};
template class D<int>;
}
-
-namespace test8 {
- template <class N> class A {
- static int x;
- template <class T> friend void foo();
- };
- template class A<int>;
-
- template <class T> void foo() {
- A<int>::x = 0;
- }
- template void foo<int>();
-}
More information about the cfe-commits
mailing list