[cfe-dev] How to create a new builtin in clang?

Andy Gibbs andyg1001 at hotmail.co.uk
Fri May 18 11:14:17 PDT 2012


On Friday, May 18, 2012 7:11 PM, Jonathan Sauer wrote:

> Maybe I'm missing something, but constexpr does exactly that

It does and it doesn't.  If you declare a variable 'constexpr' then you can 
expect that a compile-time-evaluated constant is assigned to it.  However, a 
'constexpr'-declared variable is forever immutable (which may not be what 
you want) and if you do not declare a variable 'constexpr' then you cannot 
assume it will be given an initial value which is compile-time-evaluated. 
In this way, 'constexpr' can be considered merely a hint to the compiler, 
like 'inline' is: the compiler can choose whether to obey it or not, usually 
depending on the optimisation level.  There is not, as far as I am aware, a 
way within the C++11 standard of actually forcing an expression to be 
evaluated by the compiler, except by tricks.  On such way is as follows:

template <typename T, T Value>
struct Constant {
    static constexpr T value = Value;
};

#define CONST(X) Constant<decltype(X),(X)>::value

int value = CONST(... some expression ...);

This trick will not work, however, where 'T' is (for example) a double or a 
struct, since you cannot pass such a value as a template parameter.

Using __builtin_constant_p(...), it is possible to test whether an 
expression can be compile-time evaluated, the next logical step would be a 
builtin which returns the result of the evaluation itself.  It would form a 
contract between user and compiler: the user would be sure that as long as 
his code compiles, his expression is evaluated by the compiler and never at 
runtime.

Andy

 




More information about the cfe-dev mailing list