[clang] e0fcdf5 - Revert "In MSVC compatibility mode, friend function declarations behave as function declarations"
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Fri May 13 06:53:02 PDT 2022
Author: Nico Weber
Date: 2022-05-13T09:48:01-04:00
New Revision: e0fcdf5496ca686c8cebb63b63af86e666b42ab3
URL: https://github.com/llvm/llvm-project/commit/e0fcdf5496ca686c8cebb63b63af86e666b42ab3
DIFF: https://github.com/llvm/llvm-project/commit/e0fcdf5496ca686c8cebb63b63af86e666b42ab3.diff
LOG: Revert "In MSVC compatibility mode, friend function declarations behave as function declarations"
This reverts commit ad47114ad8500c78046161d492ac13a8e3e610eb.
See discussion on https://reviews.llvm.org/D124613.
Added:
Modified:
clang/lib/Sema/SemaDecl.cpp
clang/unittests/AST/ASTImporterTest.cpp
Removed:
clang/test/SemaCXX/ms-friend-function-decl.cpp
################################################################################
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index d599cd619420b..315f328fca6a1 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -9632,15 +9632,11 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
}
if (isFriend) {
- // In MSVC mode for older versions of the standard, friend function
- // declarations behave as declarations
- bool PerformFriendInjection =
- getLangOpts().MSVCCompat && !getLangOpts().CPlusPlus20;
if (FunctionTemplate) {
- FunctionTemplate->setObjectOfFriendDecl(PerformFriendInjection);
+ FunctionTemplate->setObjectOfFriendDecl();
FunctionTemplate->setAccess(AS_public);
}
- NewFD->setObjectOfFriendDecl(PerformFriendInjection);
+ NewFD->setObjectOfFriendDecl();
NewFD->setAccess(AS_public);
}
diff --git a/clang/test/SemaCXX/ms-friend-function-decl.cpp b/clang/test/SemaCXX/ms-friend-function-decl.cpp
deleted file mode 100644
index d146305800738..0000000000000
--- a/clang/test/SemaCXX/ms-friend-function-decl.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-// RUN: %clang_cc1 -std=c++03 -fms-compatibility -fsyntax-only -verify %s
-// RUN: %clang_cc1 -std=c++17 -fms-compatibility -fsyntax-only -verify %s
-// RUN: %clang_cc1 -std=c++20 -fms-compatibility -fsyntax-only -verify=modern %s
-#if __cplusplus < 202002L
-// expected-no-diagnostics
-#endif
-
-namespace ns {
-
-class C {
-public:
- template <typename T>
- friend void funtemp();
-
- friend void fun();
-
- void test() {
- ::ns::fun(); // modern-error {{no member named 'fun' in namespace 'ns'}}
-
- // modern-error at +3 {{no member named 'funtemp' in namespace 'ns'}}
- // modern-error at +2 {{expected '(' for function-style cast or type construction}}
- // modern-error at +1 {{expected expression}}
- ::ns::funtemp<int>();
- }
-};
-
-void fun() {
-}
-
-template <typename T>
-void funtemp() {}
-
-} // namespace ns
-
-class Glob {
-public:
- friend void funGlob();
-
- void test() {
- funGlob(); // modern-error {{use of undeclared identifier 'funGlob'}}
- }
-};
-
-void funGlob() {
-}
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index 2cda013a45edc..856010cd4d036 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -2658,10 +2658,7 @@ TEST_P(ImportFriendFunctions, Lookup) {
getTuDecl("struct X { friend void f(); };", Lang_CXX03, "input0.cc");
auto *FromD = FirstDeclMatcher<FunctionDecl>().match(FromTU, FunctionPattern);
ASSERT_TRUE(FromD->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
- // Before CXX20, MSVC treats friend function declarations as function
- // declarations
- ASSERT_EQ(FromTU->getLangOpts().MSVCCompat,
- FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+ ASSERT_FALSE(FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary));
{
auto FromName = FromD->getDeclName();
auto *Class = FirstDeclMatcher<CXXRecordDecl>().match(FromTU, ClassPattern);
@@ -2705,10 +2702,7 @@ TEST_P(ImportFriendFunctions, LookupWithProtoAfter) {
auto *FromNormal =
LastDeclMatcher<FunctionDecl>().match(FromTU, FunctionPattern);
ASSERT_TRUE(FromFriend->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
- // Before CXX20, MSVC treats friend function declarations as function
- // declarations
- ASSERT_EQ(FromTU->getLangOpts().MSVCCompat,
- FromFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+ ASSERT_FALSE(FromFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary));
ASSERT_FALSE(FromNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
ASSERT_TRUE(FromNormal->isInIdentifierNamespace(Decl::IDNS_Ordinary));
@@ -2799,10 +2793,7 @@ TEST_P(ImportFriendFunctions, ImportFriendChangesLookup) {
ASSERT_TRUE(FromNormalF->isInIdentifierNamespace(Decl::IDNS_Ordinary));
ASSERT_FALSE(FromNormalF->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
- // Before CXX20, MSVC treats friend function declarations as function
- // declarations
- ASSERT_EQ(FromFriendTU->getLangOpts().MSVCCompat,
- FromFriendF->isInIdentifierNamespace(Decl::IDNS_Ordinary));
+ ASSERT_FALSE(FromFriendF->isInIdentifierNamespace(Decl::IDNS_Ordinary));
ASSERT_TRUE(FromFriendF->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend));
auto LookupRes = FromNormalTU->noload_lookup(FromNormalName);
ASSERT_TRUE(LookupRes.isSingleResult());
More information about the cfe-commits
mailing list