On 24/02/2014 16:19, David Blaikie wrote:



On Sun, Feb 23, 2014 at 10:08 PM, Alp Toker <[email protected] <mailto:[email protected]>> wrote:

    Hi Aaron,

    As a fix for PR15853 this is looking OK and almost there.

    It's quirky to put a synthesis of the attribute parse rules in the
    preprocessor but your approach meets needs that the other
    solutions don't so it's cool.

    However the addition of new semantics to the existing
    __has_feature() macro is problematic given that even ToT clang
    will error out the preprocessor whenever new-style arguments are
    encountered. That's bad news for a feature check macro that needs
    to work on a range of clang versions.

    I know you've since added __has_feature(__has_attribute_syntax) to
    work around the problem but it's not discoverable and I suspect
    the feature check won't get used correctly in the wild.

    So how about just naming the new check __has_attribute_syntax()?


Why would this be more discoverable than __has_feature(__has_attribute_syntax)?

If a user writes __has_attribute_syntax() and it doesn't work on some other compiler, the natural thing to do is to check and conditionalize on whether the macro exists with ifdef.

#ifndef __has_attribute_syntax
#define __has_attribute_syntax(...)
#endif

That's how the existing feature check macros work and users have been successfully conditionalizing the macros in this way.

The trouble is that __has_attribute() already exists so changing the semantics will break current versions of clang:

#ifndef __has_attribute
#define __has_attribute([[deprecated]]) // no good, preprocessor error on clang ToT
#endif

It's non-obvious for the user to then make the leap that this __has_attribute() check needs to be conditionalized against a second level __has_feature(__has_attribute_syntax) because the user has to learn two other features -- '__has_feature' and '__has_attribute_syntax' which have little connection to '__has_attribute' in order to safely use '__has_attribute' with the new semantics.

Adding the functionality with a new name makes it usable without resorting to the compiler documentation.

Alp.




    That way the widely-recognised feature detection fallback pattern
    will just work and you can drop the  __has_feature workaround
    entirely. Users will be able to use the familiar:

    #ifndef __has_attribute_syntax
    #define __has_attribute_syntax(...)
    #endif

    Doing this also means we can remove the old, ambiguous
    identifier-only form of the check from the new version of the
    check. With this change to your proposed patch we can ensure safe
    and compatible usage which is important with vendor extensions
    like this.

    Alp.



    On 23/02/2014 16:24, Aaron Ballman wrote:

        Ping

        ~Aaron

        On Wed, Feb 19, 2014 at 1:05 PM, Aaron Ballman
        <[email protected] <mailto:[email protected]>> wrote:

            This is the latest version of this patch -- with some
            additional
            features as requested. Specifically, this is using the
            existing
            __has_attribute syntax in an extended style, and implements a
            feature-test macro (__has_feature(__has_attribute_syntax))
            which
            allows you to determine whether the extended syntax is
            supported or
            not. It adds some additional documentation explaining this.

            ~Aaron

            On Thu, Jan 23, 2014 at 10:23 AM, Aaron Ballman
            <[email protected] <mailto:[email protected]>>
            wrote:

                Before I start in on this again, I wanted to make sure
                that there was
                a consensus that this functionality was desirable. I
                believe the
                answer (based on some conversations in IRC and here on
                the lists) was
                tentatively "yes."

                As far as I can tell, the work left to be done on this
                is to add a
                feature test for __has_attribute_syntax, write the
                documentation for
                it and that's about it? The syntax-based form is the
                preferable
                nomenclature because it leaves the door open for
                testing parameters at
                some point in the future, and with the
                __has_attribute_syntax feature
                test, it is both backwards and forwards compatible.

                ~Aaron

                On Mon, Jan 13, 2014 at 8:49 PM, Richard Smith
                <[email protected] <mailto:[email protected]>>
                wrote:

                    On Mon, Jan 13, 2014 at 5:44 PM, Aaron Ballman
                    <[email protected]
                    <mailto:[email protected]>>
                    wrote:

                        On Mon, Jan 13, 2014 at 8:39 PM, Richard Smith
                        <[email protected]
                        <mailto:[email protected]>>
                        wrote:

                            On Mon, Jan 13, 2014 at 5:31 PM, Aaron
                            Ballman <[email protected]
                            <mailto:[email protected]>>
                            wrote:

                                On Mon, Jan 13, 2014 at 8:20 PM,
                                Richard Smith <[email protected]
                                <mailto:[email protected]>>
                                wrote:

                                    On Sun, Jan 12, 2014 at 4:49 PM,
                                    Aaron Ballman
                                    <[email protected]
                                    <mailto:[email protected]>>
                                    wrote:

                                        On Sun, Jan 12, 2014 at 7:38
                                        PM, Sean Silva
                                        <[email protected]
                                        <mailto:[email protected]>>
                                        wrote:



                                            On Sun, Jan 12, 2014 at
                                            6:53 PM, Aaron Ballman
                                            <[email protected]
                                            <mailto:[email protected]>>
                                            wrote:

                                                    That's good news
                                                    -- thanks for
                                                    confirming.

                                                    The feature
                                                    detection macro
                                                    itself will still
                                                    need to have a
                                                    different
                                                    name
                                                    (or some other
                                                    mechanism) so it
                                                    can be used
                                                    compatibly with
                                                    existing
                                                    clang
                                                    deployments,
                                                    because
                                                    _has_attribute()
                                                    currently emits a
                                                    parse
                                                    error
                                                    instead
                                                    of gracefully
                                                    returning 0 when
                                                    passed the new
                                                    argument syntax:

                                                    tmp/attr2.cpp:1:5:
                                                    error: builtin
                                                    feature check
                                                    macro requires
                                                    a
                                                    parenthesized
                                                    identifier
                                                    #if
                                                    
__has_attribute(__attribute__((weakref)))
                                                         ^

                                                Good catch.
                                                Unfortunately,
                                                __has_attribute is
                                                really the best
                                                identifier for the
                                                macro, so I am loathe
                                                to let it go.

                                                Due to the current
                                                design of
                                                __has_attribute, we
                                                can't get away
                                                with
                                                "
                                                magic" by expanding
                                                the non-function-like
                                                form into a value that
                                                could
                                                be tested. So we would
                                                really have to pick a
                                                new name if we are
                                                worried about this.

                                                Suggestions on the
                                                name are welcome.


                                            Ok, I'll bite:

                                            __has_attribute_written_as([[foo]])
                                            __has_attribute_syntax([[foo]])
                                            __has_attribute_spelling([[foo]])

                                        I kind of like
                                        __has_attribute_syntax, truth
                                        be told.


                                    Have we given up on using the name
                                    __has_attribute too soon? Users of
                                    the
                                    new syntax could write:

                                    // Probably already in project's
                                    porting header
                                    #ifndef __has_feature
                                    #define __has_feature(x) 0
                                    #endif

                                    #if
                                    __has_feature(__has_attribute_syntax)
                                    #define MY_HAS_ATTRIBUTE(...)
                                    __has_attribute(__VA_ARGS__)
                                    #else
                                    #define MY_HAS_ATTRIBUTE(...) 0
                                    #endif

                                    If it's given a different name,
                                    they instead would write something
                                    like:

                                    #ifdef __has_attribute_syntax
                                    #define MY_HAS_ATTRIBUTE(...)
                                    __has_attribute_syntax(__VA_ARGS__)
                                    #else
                                    #define MY_HAS_ATTRIBUTE(...) 0
                                    #endif

                                    So I don't think the
                                    change-in-syntax argument holds water.

                                So are you proposing that we would
                                have a different name for the
                                purposes of the __has_feature macro? Eg)
                                __has_feature(__has_attribute_syntax)
                                is 1 for the proposed
                                functionality, and 0 otherwise?


                            It's a possibility. It could be that a new
                            name is a better approach,
                            but
                            both directions seem to be feasible.

                        I'll ponder; I rather like keeping the
                        existing name.


                    By the same argument, it's possible to add extra
                    arguments to
                    __has_attribute, if we have a __has_feature check
                    for the new syntax.

                                    Also, supporting arguments in the
                                    attributes is useful in some cases
                                    --
                                    it's
                                    not true that they don't make
                                    sense in a feature-checking facility.
                                    For
                                    instance:

                                       __has_attribute(
                                    __attribute__((format)) )

                                    ... doesn't tell me whether
                                    __attribute__((format, gnu_scanf,
                                    1, 2)
                                    will
                                    work (and I'd expect that the
                                    format attribute will gain additional
                                    archetypes in future).

                                That's true, but the example also
                                demonstrates why it's kind of
                                nonsensical. What do the 1, 2
                                represent for the purposes of
                                __has_attribute?


                            They represent themselves. Suppose we
                            added support for a format
                            attribute
                            with negative indices, or with three
                            indices, or something -- this
                            syntax
                            would allow the user to determine if that
                            syntax is available.

                                Can they be elided? If so, can we come
                                up with
                                declarative rules as to when they can
                                be elided?


                            If you could omit them, how would you tell
                            whether an attribute could be
                            used without arguments?

                            Again, I'm not saying we should go in this
                            direction, but I don't think
                            we
                            should dismiss it without consideration --
                            we probably don't want to
                            find we
                            need a third form of __has_attribute later =)

                        That's one of the reasons Alp's suggestion for
                        forwards compatibility
                        is so nice -- if implemented properly, we
                        could add parameter support
                        at a later date (presuming we stick with the
                        attribute syntax style
                        approach).

                        I'd like to avoid attempting to preprocess
                        parameters for this patch,
                        but had intended to leave the door open for
                        the future. So it wasn't
                        entirely without consideration. ;-)


                    =) OK then!


-- http://www.nuanti.com
    the browser experts



--
http://www.nuanti.com
the browser experts

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

Reply via email to