• E
    qapi: Test for various name collisions · d220fbcd
    Eric Blake 提交于
    Expose some weaknesses in the generator: we don't always forbid
    the generation of structs that contain multiple members that map
    to the same C or QMP name.  This has already been marked FIXME in
    qapi.py in commit d90675fa, but having more tests will make sure
    future patches produce desired behavior; and updating existing
    patches to better document things doesn't hurt, either.  Some of
    these collisions are already caught in the old-style parser
    checks, but ultimately we want all collisions to be caught in the
    new-style QAPISchema*.check() methods.
    
    This patch focuses on C struct members, and does not consider
    collisions between commands and events (affecting C function
    names), or even collisions between generated C type names with
    user type names (for things like automatic FOOList struct
    representing array types or FOOKind for an implicit enum).
    
    There are two types of struct collisions we want to catch:
     1) Collision between two keys in a JSON object. qapi.py prevents
        that within a single struct (see test duplicate-key), but it is
        possible to have collisions between a type's members and its
        base type's members (existing tests struct-base-clash,
        struct-base-clash-deep), and its flat union variant members
        (renamed test flat-union-clash-member).
     2) Collision between two members of the C struct that is generated
        for a given QAPI type:
        a) Multiple QAPI names map to the same C name (new test
           args-name-clash)
        b) A QAPI name maps to a C name that is used for another purpose
           (new tests flat-union-clash-branch, struct-base-clash-base,
           union-clash-data). We already fixed some such cases in commit
           0f61af3e and 1e6c1616, but more remain.
        c) Two C names generated for other purposes clash
           (updated test alternate-clash, new test union-clash-branches,
           union-clash-type, flat-union-clash-type)
    
    Ultimately, if we need to have a flat union where a tag value
    clashes with a base member name, we could change the generator to
    name the union (using 'foo.u.value' rather than 'foo.value') or
    otherwise munge the C name corresponding to tag values.  But
    unless such a need arises, it will probably be easier to just
    forbid these collisions.
    
    Some of these negative tests will be deleted later, and positive
    tests added to qapi-schema-test.json in their place, when the
    generator code is reworked to avoid particular code generation
    collisions in class 2).
    
    [Note that viewing this patch with git rename detection enabled
    may see some confusion due to renaming some tests while adding
    others, but where the content is similar enough that git picks
    the wrong pre- and post-patch files to associate]
    Signed-off-by: NEric Blake <eblake@redhat.com>
    Message-Id: <1443565276-4535-6-git-send-email-eblake@redhat.com>
    [Improve commit message and comments a bit, drop an unrelated test]
    Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
    d220fbcd
union-clash-data.err 0 字节