On May 2, 2012, at 17:23, Eli Friedman wrote:

> It's not obvious to me that this is safe... __attribute((const)) means
> that a function doesn't cause expose any side-effects, not that it
> doesn't have any internal state.

I'm not a language [extension] lawyer, but as I understand it the intention of 
the [[const]] attribute is that such functions should /always/ be subject to 
CSE, even if they are /not/ truly stateless. Think about the case where you 
/don't/ have the implementation, just the header file. To quote the GCC manual:

> [[pure]]: Many functions have no effects except the return value and their 
> return value depends only on the parameters and/or global variables. Such a 
> function can be subject to common subexpression elimination and loop 
> optimization just as an arithmetic operator would be. These functions should 
> be declared with the attribute pure. For example,
> 
> int square (int) __attribute__ ((pure));
> 
> says that the hypothetical function square is safe to call fewer times than 
> the program says.

> [[const]]: Many functions do not examine any values except their arguments, 
> and have no effects except the return value. Basically this is just slightly 
> more strict class than the pure attribute [above], since function is not 
> allowed to read global memory.
> 
> Note that a function that has pointer arguments and examines the data pointed 
> to must not be declared const. Likewise, a function that calls a non-const 
> function usually must not be const. It does not make sense for a const 
> function to return void.

I'm not sure how this interacts with inline asm, though, or indeed inlining in 
general.

Jordy



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to