r231451 - Don't crash on non-public referenced dtors in toplevel classes.

Hans Wennborg hans at chromium.org
Fri Mar 6 11:50:51 PST 2015


Tom, is this OK for 3.6.1?

On Thu, Mar 5, 2015 at 10:01 PM, Nico Weber <nicolasweber at gmx.de> wrote:
> Author: nico
> Date: Fri Mar  6 00:01:06 2015
> New Revision: 231451
>
> URL: http://llvm.org/viewvc/llvm-project?rev=231451&view=rev
> Log:
> Don't crash on non-public referenced dtors in toplevel classes.
>
> Fixes PR22793, a bug that caused self-hosting to fail after the innocuous
> r231254. See the bug for details.
>
> Modified:
>     cfe/trunk/lib/Sema/SemaExpr.cpp
>     cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=231451&r1=231450&r2=231451&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Mar  6 00:01:06 2015
> @@ -117,7 +117,7 @@ static AvailabilityResult DiagnoseAvaila
>      case AR_Available:
>      case AR_NotYetIntroduced:
>        break;
> -
> +
>      case AR_Deprecated:
>        if (S.getCurContextAvailability() != AR_Deprecated)
>          S.EmitAvailabilityWarning(Sema::AD_Deprecation,
> @@ -11859,8 +11859,11 @@ void Sema::MarkFunctionReferenced(Source
>    } else if (CXXDestructorDecl *Destructor =
>                   dyn_cast<CXXDestructorDecl>(Func)) {
>      Destructor = cast<CXXDestructorDecl>(Destructor->getFirstDecl());
> -    if (Destructor->isDefaulted() && !Destructor->isDeleted())
> +    if (Destructor->isDefaulted() && !Destructor->isDeleted()) {
> +      if (Destructor->isTrivial() && !Destructor->hasAttr<DLLExportAttr>())
> +        return;
>        DefineImplicitDestructor(Loc, Destructor);
> +    }
>      if (Destructor->isVirtual() && getLangOpts().AppleKext)
>        MarkVTableUsed(Loc, Destructor->getParent());
>    } else if (CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(Func)) {
>
> Modified: cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp?rev=231451&r1=231450&r2=231451&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/trivial-constructor-init.cpp Fri Mar  6 00:01:06 2015
> @@ -32,3 +32,17 @@ static C c[4];
>
>  int main() {
>  }
> +
> +namespace PR22793 {
> +template <typename>
> +struct foo {
> +protected:
> +// CHECK-NOT: _ZN7PR227933fooIiED2Ev
> +  ~foo() = default;
> +  friend void func();
> +};
> +
> +void func() { foo<int> f; }
> +
> +template struct foo<int>;
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list