On Tue, May 19, 2015 at 2:19 PM, Nick Lewycky <[email protected]> wrote:

> On 18 May 2015 at 12:59, Ismail Pazarbasi <[email protected]>
> wrote:
>
>> Author: ismailp
>> Date: Mon May 18 14:59:11 2015
>> New Revision: 237608
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=237608&view=rev
>> Log:
>> Detect uses of mismatching forms of 'new' and 'delete'
>>
>> Emit warning when operand to `delete` is allocated with `new[]` or
>> operand to `delete[]` is allocated with `new`.
>>
>> rev 2 update:
>> `getNewExprFromInitListOrExpr` should return `dyn_cast_or_null`
>> instead of `dyn_cast`, since `E` might be null.
>>
>
> FYI, I'm getting an assertion firing:
>
> clang: llvm/tools/clang/lib/Sema/SemaExprCXX.cpp:2447: const
> clang::CXXNewExpr *(anonymous
> namespace)::MismatchingNewDeleteDetector::getNewExprFromInitListOrExpr(const
> clang::Expr *): Assertion `E != nullptr && "Expected a valid initializer
> expression"' failed.
>
> on presumed to be valid code (code that builds with a previous version of
> clang). I'm creduce'ing a testcase now.
>
>
Try this reduced case:

template <typename T>
struct Base {
  struct S {
    const T *t = 0;
  };
};

void Foo(Base<double>::S s) { delete s.t; }

I think what is happening is that the warning is looking for the
initializer of Base<double>::S::t, which is never used and not
instantiated.  So, the FieldDecl reports that it has an initializer, but
returns a null pointer when trying to retrieve it.
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to