On Oct 19, 2012, at 10:51 PM, Richard Smith <rich...@metafoo.co.uk> wrote:

> 
> On Fri, Oct 19, 2012 at 10:50 PM, Chandler Carruth <chandl...@google.com> 
> wrote:
> On Fri, Oct 19, 2012 at 10:04 PM, Richard Smith <rich...@metafoo.co.uk> wrote:
> [Crossposted to both GCC and Clang dev lists]
> 
> Hi,
> 
> One issue facing library authors wanting to use C++11's constexpr feature is 
> that the same implementation must be provided for both the case of function 
> invocation substitution and for execution at runtime. Due to the constraints 
> on constexpr function definitions, this can force an implementation of a 
> library function to be inefficient. To counteract this, I'd like to propose 
> the addition of a builtin:
> 
>   bool __builtin_constexpr_p()
> 
> This builtin would only be supported within constexpr function definitions. 
> If the containing function is undergoing function invocation substitution, it 
> returns true. Otherwise, it returns false. Hence we can implement library 
> functions with a pattern like:
> 
>   constexpr int constexpr_strncmp(const char *p, const char *q, size_t n) {
>     return !n ? 0 : *p != *q ? *p - *q : !*p ? 0 : constexpr_strncmp(p+1, 
> q+1, n-1);
>   }
>   __attribute__((always_inline)) constexpr int my_strncmp(const char *p, 
> const char *q, size_t n) {
>     return __builtin_constexpr_p() ? constexpr_strncmp(p, q, n) : strncmp(p, 
> q, n);
>   }
> 
> Does this seem reasonable?
> 
> Yes, especially the primary functionality. However, I have some concerns 
> about the interface. Let me hypothesize a different interface:
> 
> This stays the same...
> constexpr int constexpr_strncmp(const char *p, const char *q, size_t n) {
>   return !n ? 0 : *p != *q ? *p - *q : !*p ? 0 : constexpr_strncmp(p+1, q+1, 
> n-1);
> }
> 
> But here we do something different on the actual declaration:
> [[constexpr_alias(constexpr_strncmp)]]
> int strncmp(const char *p, const char *q, size_t n);
> 
> When parsing the *declaration* of this function, we lookup the function name 
> passed to constexpr_alias. We must find a constexpr function with an 
> identical signature. Then, at function invocation substitution of strncmp, we 
> instead substitute the body of constexpr_strncmp.
> 
> This seems more direct (no redirection in the code), and it also provides a 
> specific advantage of allowing this to be easily added to an existing 
> declaration in a declaration-only header file without impacting or changing 
> the name of the runtime executed body or definition.
> 
> I really like this approach.

I'd love to see this is in the pre-Bristol mailing with implementation 
experience to back it up. :-)  Nice job Richard and Chandler!

Howard


Reply via email to