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@+3 {{no member named 'funtemp' in namespace 'ns'}} - // modern-error@+2 {{expected '(' for function-style cast or type construction}} - // modern-error@+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()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits