Hmm, odd that such a rule wouldn't exist. Not at all odd! We have almost no rules *whatsoever* on what's allowed in each operand of a GENERIC tree. That's the problem here.
To me it seems an ADDR_EXPR only makes sense on something that is addressable, First of all, define "addressable". Clearly a STRING_CST is, but is an INTEGER_CST? But secondly, why make that restriction at all? Suppose I have a function to which a language semantics requires passing by reference. Now suppose the operand is "a + b". Why not just make an ADDR_EXPR of the PLUS_EXPR? Sure, the front end *could* make a temporary, but the gimplifier has all the logic already to do that, so why shouldn't it? The whole point of the gimplifier is to avoid making too many restrictions on what are valid trees: it's GIMPLE where we want to make those restrictions. It seems very duplicative to me to say that the process of creating temporaries for certain expressable trees is the job of the front end and for others is the job of the gimplifier? Why not just be consistent and say it's the gimplifier's job to do all of them?