On Sun, Jan 22, 2012 at 9:50 PM, Nico Weber <[email protected]> wrote:
> Author: nico
> Date: Sun Jan 22 23:50:57 2012
> New Revision: 148682
>
> URL: http://llvm.org/viewvc/llvm-project?rev=148682&view=rev
> Log:
> In microsoft mode, downgrade pseudo-destructors on void from error to warning.
>
> This matches cl.exe's behavior and fixes PR11791.
>
>
> Modified:
>    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>    cfe/trunk/lib/Sema/SemaExprCXX.cpp
>    cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=148682&r1=148681&r2=148682&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Jan 22 23:50:57 
> 2012
> @@ -4053,6 +4053,9 @@
>  def err_pseudo_dtor_base_not_scalar : Error<
>   "object expression of non-scalar type %0 cannot be used in a "
>   "pseudo-destructor expression">;
> +def ext_pseudo_dtor_on_void : ExtWarn<
> +  "pseudo-destructors on type void are a Microsoft extension">,
> +  InGroup<Microsoft>;
>  def err_pseudo_dtor_type_mismatch : Error<
>   "the type of object expression (%0) does not match the type being destroyed 
> "
>   "(%1) in pseudo-destructor expression">;
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=148682&r1=148681&r2=148682&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sun Jan 22 23:50:57 2012
> @@ -4380,8 +4380,11 @@
>     return ExprError();
>
>   if (!ObjectType->isDependentType() && !ObjectType->isScalarType()) {
> -    Diag(OpLoc, diag::err_pseudo_dtor_base_not_scalar)
> -      << ObjectType << Base->getSourceRange();
> +    if (getLangOptions().MicrosoftMode && ObjectType->isVoidType())
> +      Diag(OpLoc, diag::ext_pseudo_dtor_on_void);
> +    else
> +      Diag(OpLoc, diag::err_pseudo_dtor_base_not_scalar)
> +        << ObjectType << Base->getSourceRange();

wouldn't you want to provide the source range to the microsoft-mode
diagnostic too?

>     return ExprError();
>   }
>
>
> Modified: cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp?rev=148682&r1=148681&r2=148682&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp (original)
> +++ cfe/trunk/test/SemaCXX/MicrosoftCompatibility.cpp Sun Jan 22 23:50:57 2012
> @@ -163,3 +163,14 @@
>  };
>
>
> +namespace PR11791 {
> +  template<class _Ty>
> +  void del(_Ty *_Ptr) {
> +    _Ptr->~_Ty();  // expected-warning {{pseudo-destructors on type void are 
> a Microsoft extension}}
> +  }
> +
> +  void f() {
> +    int* a = 0;
> +    del((void*)a);  // expected-note {{in instantiation of function template 
> specialization}}
> +  }
> +}

This test case seems a bit more convoluted than necessary - would:

typedef void *foo;
foo f;
f.~foo();

suffice? (or are you testing a different code path? I suppose checking
all the template pseudo dtor machinery might be useful - but I assume
that's all already covered by existing test cases)

- David

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to