Skip to content
  • Douglas Gregor's avatar
    Initial implementation of function overloading in C. · 4e5cbdcb
    Douglas Gregor authored
    This commit adds a new attribute, "overloadable", that enables C++
    function overloading in C. The attribute can only be added to function
    declarations, e.g.,
    
      int *f(int) __attribute__((overloadable));
    
    If the "overloadable" attribute exists on a function with a given
    name, *all* functions with that name (and in that scope) must have the
    "overloadable" attribute. Sets of overloaded functions with the
    "overloadable" attribute then follow the normal C++ rules for
    overloaded functions, e.g., overloads must have different
    parameter-type-lists from each other.
    
    When calling an overloaded function in C, we follow the same
    overloading rules as C++, with three extensions to the set of standard
    conversions:
    
      - A value of a given struct or union type T can be converted to the
        type T. This is just the identity conversion. (In C++, this would
        go through a copy constructor).
      - A value of pointer type T* can be converted to a value of type U*
        if T and U are compatible types. This conversion has Conversion
        rank (it's considered a pointer conversion in C).
      - A value of type T can be converted to a value of type U if T and U
        are compatible (and are not both pointer types). This conversion
        has Conversion rank (it's considered to be a new kind of
        conversion unique to C, a "compatible" conversion).
    
    Known defects (and, therefore, next steps):
      1) The standard-conversion handling does not understand conversions
      involving _Complex or vector extensions, so it is likely to get
      these wrong. We need to add these conversions.
      2) All overloadable functions with the same name will have the same
      linkage name, which means we'll get a collision in the linker (if
      not sooner). We'll need to mangle the names of these functions.
    
    llvm-svn: 64336
    4e5cbdcb
Loading