JonasToth added inline comments.
================ Comment at: lib/Analysis/ExprMutationAnalyzer.cpp:481 + const auto AsArg = + anyOf(callExpr(hasAnyArgument(equalsNode(Exp))), + cxxConstructExpr(hasAnyArgument(equalsNode(Exp))), ---------------- shuaiwang wrote: > JonasToth wrote: > > shouldn't be the constness of the argument considered here? > We need that for non-pointee version, but not for pointee version, for > example: > ``` > void g1(int * const); > > void f1() { > int *x; > g1(x); // <-- x is passed to `g1`, we consider that as a mutation, the > argument type do have a top-level const > } > > void g2(const int *); > > void f2() { > int *x; > g2(x); // <-- declRefExp(to(x)) is NOT directly passed to `g2`, there's a > layer a ImplicitCastExpr<NoOp> in between, and after the implicit cast, the > type of the expression becomes "const int *" instead of just "int*", so it'll > fail the `isPointeeMutable` check at the beginning of > `findPointeeDirectMutation` > } > ``` > > In summary, we rely on: > - Checking whether pointee is actually mutable at the beginning > - Carefully handling casts by not trivially ignoring them unless absolutely > safe I see. That makes sense, thanks for clarification :) Repository: rC Clang https://reviews.llvm.org/D52219 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits