diff options
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 15 | ||||
-rw-r--r-- | clang/test/SemaCXX/microsoft-dtor-lookup.cpp | 9 | ||||
-rw-r--r-- | clang/test/SemaObjCXX/microsoft-abi-byval.mm | 5 |
3 files changed, 19 insertions, 10 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 82b3da6c2e1..0e2b1f64d60 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -6241,12 +6241,21 @@ bool Sema::CheckParmsForFunctionDef(ParmVarDecl *const *P, // MSVC destroys objects passed by value in the callee. Therefore a // function definition which takes such a parameter must be able to call the - // object's destructor. + // object's destructor. However, we don't perform any direct access check + // on the dtor. if (getLangOpts().CPlusPlus && Context.getTargetInfo() .getCXXABI() .areArgsDestroyedLeftToRightInCallee()) { - if (const RecordType *RT = Param->getType()->getAs<RecordType>()) - FinalizeVarWithDestructor(Param, RT); + if (const RecordType *RT = Param->getType()->getAs<RecordType>()) { + CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(RT->getDecl()); + if (!ClassDecl->isInvalidDecl() && + !ClassDecl->hasIrrelevantDestructor() && + !ClassDecl->isDependentContext()) { + CXXDestructorDecl *Destructor = LookupDestructor(ClassDecl); + MarkFunctionReferenced(Param->getLocation(), Destructor); + DiagnoseUseOfDecl(Destructor, Param->getLocation()); + } + } } } diff --git a/clang/test/SemaCXX/microsoft-dtor-lookup.cpp b/clang/test/SemaCXX/microsoft-dtor-lookup.cpp index d264bab09bf..a25ede6d6e8 100644 --- a/clang/test/SemaCXX/microsoft-dtor-lookup.cpp +++ b/clang/test/SemaCXX/microsoft-dtor-lookup.cpp @@ -32,10 +32,9 @@ namespace Test2 { // requires a dtor for B, but we can't implicitly define it because ~A is // private. bar should be able to call A's private dtor without error, even // though MSVC rejects bar. - class A { private: - ~A(); // expected-note 2{{declared private here}} + ~A(); // expected-note {{declared private here}} int a; }; @@ -54,7 +53,7 @@ struct D { }; void foo(B b) { } // expected-note {{implicit destructor for 'Test2::B' first required here}} -void bar(A a) { } // expected-error {{variable of type 'Test2::A' has private destructor}} +void bar(A a) { } // no error; MSVC rejects this, but we skip the direct access check. void baz(D d) { } // no error } @@ -64,13 +63,13 @@ namespace Test3 { class A { A(); - ~A(); // expected-note 2{{implicitly declared private here}} + ~A(); // expected-note {{implicitly declared private here}} friend void bar(A); int a; }; void bar(A a) { } -void baz(A a) { } // expected-error {{variable of type 'Test3::A' has private destructor}} +void baz(A a) { } // no error; MSVC rejects this, but the standard allows it. // MSVC accepts foo() but we reject it for consistency with Itanium. MSVC also // rejects this if A has a copy ctor or if we call A's ctor. diff --git a/clang/test/SemaObjCXX/microsoft-abi-byval.mm b/clang/test/SemaObjCXX/microsoft-abi-byval.mm index f0c4caa9e06..9b3a5c9e057 100644 --- a/clang/test/SemaObjCXX/microsoft-abi-byval.mm +++ b/clang/test/SemaObjCXX/microsoft-abi-byval.mm @@ -1,7 +1,8 @@ // RUN: %clang_cc1 -fsyntax-only -verify -cxx-abi microsoft -Wno-objc-root-class %s +// expected-no-diagnostics class Foo { - ~Foo(); // expected-note {{implicitly declared private here}} + ~Foo(); }; @interface bar @@ -9,6 +10,6 @@ class Foo { @end @implementation bar -- (void) my_method: (Foo)arg { // expected-error {{variable of type 'Foo' has private destructor}} +- (void) my_method: (Foo)arg { // no error; MS ABI will call Foo's dtor, but we skip the access check. } @end |