summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2017-04-17 20:57:40 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2017-04-17 20:57:40 +0000
commitdcb52b167ae374b23d3f0e37cac6249257927c9d (patch)
tree23753db984b666f01b98050a212936bf2cebfc55 /clang
parentb0cec31db2905aa8e1dcd80b70616b3d5c3e16e7 (diff)
downloadbcm5719-llvm-dcb52b167ae374b23d3f0e37cac6249257927c9d.tar.gz
bcm5719-llvm-dcb52b167ae374b23d3f0e37cac6249257927c9d.zip
Revert "Address http://bugs.llvm.org/pr30994 so that a non-friend can properly replace a friend, and a visible friend can properly replace an invisible friend but not vice verse, and definitions are not replaced. This fixes the two FIXME in SemaTemplate/friend-template.cpp."
This reverts commit r300443. Breaks compiling libc++ with modules in some configurations. llvm-svn: 300497
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/DeclBase.h2
-rw-r--r--clang/lib/AST/Decl.cpp4
-rw-r--r--clang/lib/AST/DeclBase.cpp15
-rw-r--r--clang/test/SemaTemplate/friend-template.cpp26
4 files changed, 13 insertions, 34 deletions
diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h
index 5ca1f1ec6ed..c88cb6a8fd1 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -417,8 +417,6 @@ public:
return const_cast<Decl*>(this)->getTranslationUnitDecl();
}
- bool isThisDeclarationADefinition() const;
-
bool isInAnonymousNamespace() const;
bool isInStdNamespace() const;
diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
index 6a288cdb21f..2b22e5bb50a 100644
--- a/clang/lib/AST/Decl.cpp
+++ b/clang/lib/AST/Decl.cpp
@@ -1536,10 +1536,6 @@ bool NamedDecl::declarationReplaces(NamedDecl *OldD, bool IsKnownNewer) const {
if (isa<ObjCMethodDecl>(this))
return false;
- if (getFriendObjectKind() > OldD->getFriendObjectKind() &&
- !isThisDeclarationADefinition())
- return false;
-
// For parameters, pick the newer one. This is either an error or (in
// Objective-C) permitted as an extension.
if (isa<ParmVarDecl>(this))
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index ae7444579b0..cda70c5edcd 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -861,21 +861,6 @@ const FunctionType *Decl::getFunctionType(bool BlocksToo) const {
return Ty->getAs<FunctionType>();
}
-bool Decl::isThisDeclarationADefinition() const {
- if (auto *TD = dyn_cast<TagDecl>(this))
- return TD->isThisDeclarationADefinition();
- if (auto *FD = dyn_cast<FunctionDecl>(this))
- return FD->isThisDeclarationADefinition();
- if (auto *VD = dyn_cast<VarDecl>(this))
- return VD->isThisDeclarationADefinition();
- if (auto *CTD = dyn_cast<ClassTemplateDecl>(this))
- return CTD->isThisDeclarationADefinition();
- if (auto *FTD = dyn_cast<FunctionTemplateDecl>(this))
- return FTD->isThisDeclarationADefinition();
- if (auto *VTD = dyn_cast<VarTemplateDecl>(this))
- return VTD->isThisDeclarationADefinition();
- return false;
-}
/// Starting at a given context (a Decl or DeclContext), look for a
/// code context that is not a closure (a lambda, block, etc.).
diff --git a/clang/test/SemaTemplate/friend-template.cpp b/clang/test/SemaTemplate/friend-template.cpp
index 1ed751b4f36..e9b2b9b8e64 100644
--- a/clang/test/SemaTemplate/friend-template.cpp
+++ b/clang/test/SemaTemplate/friend-template.cpp
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify %s
// PR5057
namespace test0 {
namespace std {
@@ -68,12 +68,17 @@ namespace test3 {
Foo<int> foo;
template<typename T, T Value> struct X2a;
- template<typename T, int Size> struct X2b; // expected-note {{previous non-type template parameter with type 'int' is here}}
+
+ template<typename T, int Size> struct X2b;
template<typename T>
class X3 {
template<typename U, U Value> friend struct X2a;
- template<typename U, T Value> friend struct X2b; // expected-error {{template non-type parameter has a different type 'long' in template redeclaration}}
+
+ // FIXME: the redeclaration note ends up here because redeclaration
+ // lookup ends up finding the friend target from X3<int>.
+ template<typename U, T Value> friend struct X2b; // expected-error {{template non-type parameter has a different type 'long' in template redeclaration}} \
+ // expected-note {{previous non-type template parameter with type 'int' is here}}
};
X3<int> x3i; // okay
@@ -292,11 +297,14 @@ namespace PR12585 {
int n = C::D<void*>().f();
struct F {
- template<int> struct G; // expected-note {{previous}}
+ template<int> struct G;
};
template<typename T> struct H {
+ // FIXME: As with cases above, the note here is on an unhelpful declaration,
+ // and should point to the declaration of G within F.
template<T> friend struct F::G; // \
- // expected-error {{different type 'char' in template redeclaration}}
+ // expected-error {{different type 'char' in template redeclaration}} \
+ // expected-note {{previous}}
};
H<int> h1; // ok
H<char> h2; // expected-note {{instantiation}}
@@ -321,11 +329,3 @@ namespace rdar12350696 {
foo(b); // expected-note {{in instantiation}}
}
}
-namespace PR30994 {
- void f();
- struct A {
- [[deprecated]] friend void f() {} // \
- expected-note {{has been explicitly marked deprecated here}}
- };
- void g() { f(); } // expected-warning {{is deprecated}}
-}
OpenPOWER on IntegriCloud