[PATCH] Use the most recent previous decl to check if inline is added after a definition
Reid Kleckner
rnk at google.com
Tue Apr 7 13:58:34 PDT 2015
- Add alternate test case not relying on r233817
http://reviews.llvm.org/D8872
Files:
lib/Sema/SemaDeclCXX.cpp
test/SemaTemplate/friend.cpp
Index: lib/Sema/SemaDeclCXX.cpp
===================================================================
--- lib/Sema/SemaDeclCXX.cpp
+++ lib/Sema/SemaDeclCXX.cpp
@@ -615,7 +615,8 @@
<< New << New->isConstexpr();
Diag(Old->getLocation(), diag::note_previous_declaration);
Invalid = true;
- } else if (!Old->isInlined() && New->isInlined() && Old->isDefined(Def)) {
+ } else if (!Old->getMostRecentDecl()->isInlined() && New->isInlined() &&
+ Old->isDefined(Def)) {
// C++11 [dcl.fcn.spec]p4:
// If the definition of a function appears in a translation unit before its
// first declaration as inline, the program is ill-formed.
Index: test/SemaTemplate/friend.cpp
===================================================================
--- test/SemaTemplate/friend.cpp
+++ test/SemaTemplate/friend.cpp
@@ -31,3 +31,19 @@
friend class f1; // expected-error{{'friend' used outside of class}}
}
}
+
+namespace friend_redecl_inline {
+// We had a bug where instantiating the foo friend declaration would check the
+// defined-ness of the most recent decl while checking if the canonical decl was
+// inlined.
+void foo();
+void bar();
+template <typename T>
+class C {
+ friend void foo();
+ friend inline void foo();
+};
+inline void foo() {}
+inline void bar() {}
+C<int> c;
+}
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D8872.23367.patch
Type: text/x-patch
Size: 1327 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150407/62cf6cfb/attachment.bin>
More information about the cfe-commits
mailing list