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  | 

