On 12/20/2016 6:56 PM, Richard Smith wrote:
On 20 December 2016 at 18:14, Richard Smith <rich...@metafoo.co.uk <mailto:rich...@metafoo.co.uk>> wrote:

    On 19 December 2016 at 17:00, Friedman, Eli via cfe-commits
    <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>>
    wrote:

        On 12/19/2016 3:59 PM, Richard Smith via cfe-commits wrote:

            Author: rsmith
            Date: Mon Dec 19 17:59:34 2016
            New Revision: 290146

            URL:
            
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/vfprintf-valid-redecl.c?rev=290146&r1=290145&r2=290146&view=diff
            
<http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/vfprintf-valid-redecl.c?rev=290146&r1=290145&r2=290146&view=diff>
            
==============================================================================
            --- cfe/trunk/test/Sema/vfprintf-valid-redecl.c (original)
            +++ cfe/trunk/test/Sema/vfprintf-valid-redecl.c Mon Dec 19
            17:59:34 2016
            @@ -1,16 +1,18 @@
              // RUN: %clang_cc1 %s -fsyntax-only -pedantic -verify
              // RUN: %clang_cc1 %s -fsyntax-only -pedantic -verify
            -DPREDECLARE
            -// expected-no-diagnostics
                #ifdef PREDECLARE
              // PR16344
              // Clang has defined 'vfprint' in builtin list. If the
            following line occurs before any other
              // `vfprintf' in this file, and we
            getPreviousDecl()->getTypeSourceInfo() on it, then we will
              // get a null pointer since the one in builtin list
            doesn't has valid TypeSourceInfo.
            -int vfprintf(void) { return 0; }
            +int vfprintf(void) { return 0; } // expected-warning
            {{requires inclusion of the header <stdio.h>}}
              #endif
                // PR4290
              // The following declaration is compatible with
            vfprintf, so we shouldn't
            -// warn.
            +// reject.
              int vfprintf();
            +#ifndef PREDECLARE
            +// expected-warning@-2 {{requires inclusion of the header
            <stdio.h>}}
            +#endif


        We shouldn't warn here; this declaration of vfprintf() is
        compatible with the actual prototype.  (Granted, you can't
        call vfprintf() without including stdio.h, but that's a
        separate problem.)


    I agree (but I'd note that this is a pre-existing problem for
    other lib builtins taking a FILE*, particularly vfscanf). Perhaps
    we could deem the builtin to have a FunctionNoProtoType type in C
    if it's not variadic and depends on a type that is not yet declared?


What do you think of the attached approach? I'm a little uncomfortable that we no longer recognise a declaration of sigsetjmp as a builtin if it has the wrong return type (and issue only a warning for that case).

Alternatively, if we're OK with recognising wrongly-typed declarations as library builtins in this corner case, we could just remove the warning entirely.

The "right" approach is probably something a bit more invasive. We could wait, and attempt to recognize the builtin later, when the function is declared with a prototype or called. Or we could try to "forward-declare" FILE (map it to some opaque type until we have an actual declaration we can use).

Short of that, it's probably okay to leave things as-is for now; better to have extra warnings in weird edge cases than to miss a warning in a case where it's important.

-Eli

--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux 
Foundation Collaborative Project

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to