r243196 - [SemaTemplate] Detect instantiation of unparsed exceptions.
Hans Wennborg
hans at chromium.org
Mon Jul 27 16:48:54 PDT 2015
Should this be merged to 3.7?
On Fri, Jul 24, 2015 at 6:19 PM, Davide Italiano <davide at freebsd.org> wrote:
> Author: davide
> Date: Fri Jul 24 20:19:32 2015
> New Revision: 243196
>
> URL: http://llvm.org/viewvc/llvm-project?rev=243196&view=rev
> Log:
> [SemaTemplate] Detect instantiation of unparsed exceptions.
>
> This fixes the clang crash reported in PR24000.
>
> Differential Revision: http://reviews.llvm.org/D11341
>
> Added:
> cfe/trunk/test/SemaTemplate/crash-unparsed-exception.cpp
> Modified:
> cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExceptionSpec.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=243196&r1=243195&r2=243196&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExceptionSpec.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExceptionSpec.cpp Fri Jul 24 20:19:32 2015
> @@ -161,7 +161,13 @@ Sema::ResolveExceptionSpec(SourceLocatio
> else
> InstantiateExceptionSpec(Loc, SourceDecl);
>
> - return SourceDecl->getType()->castAs<FunctionProtoType>();
> + const FunctionProtoType *Proto =
> + SourceDecl->getType()->castAs<FunctionProtoType>();
> + if (Proto->getExceptionSpecType() == clang::EST_Unparsed) {
> + Diag(Loc, diag::err_exception_spec_not_parsed);
> + Proto = nullptr;
> + }
> + return Proto;
> }
>
> void
>
> Added: cfe/trunk/test/SemaTemplate/crash-unparsed-exception.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/crash-unparsed-exception.cpp?rev=243196&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaTemplate/crash-unparsed-exception.cpp (added)
> +++ cfe/trunk/test/SemaTemplate/crash-unparsed-exception.cpp Fri Jul 24 20:19:32 2015
> @@ -0,0 +1,17 @@
> +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify -fcxx-exceptions -fexceptions %s
> +
> +struct A {
> + virtual ~A();
> +};
> +template <class>
> +struct B {};
> +struct C {
> + template <typename>
> + struct D {
> + ~D() throw();
> + };
> + struct E : A {
> + D<int> d; //expected-error{{exception specification is not available until end of class definition}}
> + };
> + B<int> b; //expected-note{{in instantiation of template class 'B<int>' requested here}}
> +};
>
>
> _______________________________________________
> 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