Index: cfe/trunk/lib/Sema/SemaChecking.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp +++ cfe/trunk/lib/Sema/SemaChecking.cpp @@ -6241,12 +6241,21 @@ // 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()) - FinalizeVarWithDestructor(Param, RT); + if (const RecordType *RT = Param->getType()->getAs()) { + CXXRecordDecl *ClassDecl = cast(RT->getDecl()); + if (!ClassDecl->isInvalidDecl() && + !ClassDecl->hasIrrelevantDestructor() && + !ClassDecl->isDependentContext()) { + CXXDestructorDecl *Destructor = LookupDestructor(ClassDecl); + MarkFunctionReferenced(Param->getLocation(), Destructor); + DiagnoseUseOfDecl(Destructor, Param->getLocation()); + } + } } } Index: cfe/trunk/test/SemaCXX/microsoft-dtor-lookup.cpp =================================================================== --- cfe/trunk/test/SemaCXX/microsoft-dtor-lookup.cpp +++ cfe/trunk/test/SemaCXX/microsoft-dtor-lookup.cpp @@ -32,10 +32,9 @@ // 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 @@ }; 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 @@ 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. Index: cfe/trunk/test/SemaObjCXX/microsoft-abi-byval.mm =================================================================== --- cfe/trunk/test/SemaObjCXX/microsoft-abi-byval.mm +++ cfe/trunk/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 @@ @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