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
