arphaman added inline comments.
================ Comment at: lib/CodeGen/CGExpr.cpp:1323 + if (result.HasSideEffects && !AllowSideEffects) { + assert(!isa<DeclRefExpr>(E) && "declrefs should not have side effects"); return ConstantEmission(); ---------------- rjmccall wrote: > The side effects here are those associated with the initializer of the > referenced declaration, not the DRE itself. Some expressions can be > constant-evaluated despite having side-effects because the side-effects occur > in an ignored operand, like the LHS of a comma or the base of a MemberExpr > that refers to a static member. > > We can't allow side effects here because (1) we're not actually collecting > the side-effectful expressions to emit and (2) we'd need some permission from > the context to decide that we're allowed to do so anyway (with a lambda > capture, those side-effects have actually already been emitted, but I'm not > convinced that's always true). > > On the other hand, I think we need to be able to emit MemberExprs to static > members as constants despite the presence of side-effects in their base > expressions, and I can't think of any reasonable way to do that except > actually making a temporary DeclRefExpr to try to constant-emit instead. Thanks, I think I understand your explanation. I will try using temporary a DRE instead when a static variable is used in a member expression. That means that the old integer field evaluation code will have to stay though. Repository: rL LLVM https://reviews.llvm.org/D36876 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits