rsmith added inline comments. ================ Comment at: lib/Sema/SemaChecking.cpp:4089-4090 @@ +4088,4 @@ + if (BinOp->isAdditiveOp()) { + bool LIsInt = BinOp->getLHS()->EvaluateAsInt(LResult, S.Context); + bool RIsInt = BinOp->getRHS()->EvaluateAsInt(RResult, S.Context); + ---------------- meikeb wrote: > rsmith wrote: > > What happens if one of these expressions is value-dependent? The evaluator > > can crash or assert if given a value-dependent expression. If we don't > > defer these checks in dependent contexts, you'll need to handle that > > possibility somehow. > > > > Example: > > > > template<int N> void f(const char *p) { > > printf("blah blah %s" + N, p); > > } > I think I don't understand what you are trying to tell me. Especially the > example you provided does just fine and behaves as I expected. As far as I > followed EvaluateAsInt it does not assert but returns false if we don't get a > constexpr here. We warn under -Wformat-nonliteral for value-dependent string > literals. > > Could you explain this more or provide an example that triggers an assert or > explain what behavior is wrong regarding the provided example? Thanks! We should not warn for that example, since (for instance) calling `f<0>` is fine (we should warn for `f<11>`, though, since it has no format specifiers).
While `EvaluateAsInt` happens to not assert for that particular value-dependent input, it does assert for some other value-dependent cases. It's not easy for me to find you such a case, because Clang is currently careful to never call this function on a value-dependent expression, but perhaps this will trigger an assert: struct S { constexpr S(int n) : n(n) {} int n; }; template<int N> void f(const char *p) { printf("blah blah %s" + S(N).n, p); } https://reviews.llvm.org/D23820 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits