r367387 - [Fix] Customize warnings for missing built-in types

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 1 02:02:28 PDT 2019


Merged to release_90 in r367528.

On Wed, Jul 31, 2019 at 7:15 AM Johannes Doerfert via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: jdoerfert
> Date: Tue Jul 30 22:16:38 2019
> New Revision: 367387
>
> URL: http://llvm.org/viewvc/llvm-project?rev=367387&view=rev
> Log:
> [Fix] Customize warnings for missing built-in types
>
> If we detect a built-in declaration for which we cannot derive a type
> matching the pattern in the Builtins.def file, we currently emit a
> warning that the respective header is needed. However, this is not
> necessarily the behavior we want as it has no connection to the location
> of the declaration (which can actually be in the header in question).
> Instead, this warning is generated
>   - if we could not build the type for the pattern on file (for some
>     reason). Here we should make the reason explicit. The actual problem
>     is otherwise circumvented as the warning is misleading, see [0] for
>     an example.
>   - if we could not build the type for the pattern because we do not
>     have a type on record, possible since D55483, we should not emit any
>     warning. See [1] for a legitimate problem.
>
> This patch address both cases. For the "setjmp" family a new warning is
> introduced and for built-ins without type on record, so far
> "pthread_create", we do not emit the warning anymore.
>
> Also see: PR40692
>
> [0] https://lkml.org/lkml/2019/1/11/718
> [1] https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=235583
>
> Differential Revision: https://reviews.llvm.org/D58091
>
> Added:
>     cfe/trunk/test/Sema/builtin-setjmp.c
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>     cfe/trunk/test/Analysis/retain-release.m
>     cfe/trunk/test/Sema/implicit-builtin-decl.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=367387&r1=367386&r2=367387&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Jul 30 22:16:38 2019
> @@ -598,6 +598,10 @@ def ext_implicit_lib_function_decl : Ext
>  def note_include_header_or_declare : Note<
>    "include the header <%0> or explicitly provide a declaration for '%1'">;
>  def note_previous_builtin_declaration : Note<"%0 is a builtin with type %1">;
> +def warn_implicit_decl_no_jmp_buf
> +    : Warning<"declaration of built-in function '%0' requires the declaration"
> +    " of the 'jmp_buf' type, commonly provided in the header <setjmp.h>.">,
> +      InGroup<DiagGroup<"incomplete-setjmp-declaration">>;
>  def warn_implicit_decl_requires_sysheader : Warning<
>    "declaration of built-in function '%1' requires inclusion of the header <%0>">,
>    InGroup<BuiltinRequiresHeader>;
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=367387&r1=367386&r2=367387&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Jul 30 22:16:38 2019
> @@ -1983,10 +1983,27 @@ NamedDecl *Sema::LazilyCreateBuiltin(Ide
>    ASTContext::GetBuiltinTypeError Error;
>    QualType R = Context.GetBuiltinType(ID, Error);
>    if (Error) {
> -    if (ForRedeclaration)
> -      Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
> -          << getHeaderName(Context.BuiltinInfo, ID, Error)
> +    if (!ForRedeclaration)
> +      return nullptr;
> +
> +    // If we have a builtin without an associated type we should not emit a
> +    // warning when we were not able to find a type for it.
> +    if (Error == ASTContext::GE_Missing_type)
> +      return nullptr;
> +
> +    // If we could not find a type for setjmp it is because the jmp_buf type was
> +    // not defined prior to the setjmp declaration.
> +    if (Error == ASTContext::GE_Missing_setjmp) {
> +      Diag(Loc, diag::warn_implicit_decl_no_jmp_buf)
>            << Context.BuiltinInfo.getName(ID);
> +      return nullptr;
> +    }
> +
> +    // Generally, we emit a warning that the declaration requires the
> +    // appropriate header.
> +    Diag(Loc, diag::warn_implicit_decl_requires_sysheader)
> +        << getHeaderName(Context.BuiltinInfo, ID, Error)
> +        << Context.BuiltinInfo.getName(ID);
>      return nullptr;
>    }
>
>
> Modified: cfe/trunk/test/Analysis/retain-release.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/retain-release.m?rev=367387&r1=367386&r2=367387&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/retain-release.m (original)
> +++ cfe/trunk/test/Analysis/retain-release.m Tue Jul 30 22:16:38 2019
> @@ -2,7 +2,7 @@
>  // RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10\
>  // RUN:     -analyzer-checker=core,osx.coreFoundation.CFRetainRelease\
>  // RUN:     -analyzer-checker=osx.cocoa.ClassRelease,osx.cocoa.RetainCount\
> -// RUN:     -analyzer-checker=debug.ExprInspection -fblocks -verify=expected,C %s\
> +// RUN:     -analyzer-checker=debug.ExprInspection -fblocks -verify %s\
>  // RUN:     -Wno-objc-root-class -analyzer-output=plist -o %t.objc.plist
>  // RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10\
>  // RUN:     -analyzer-checker=core,osx.coreFoundation.CFRetainRelease\
> @@ -1231,7 +1231,7 @@ typedef __darwin_pthread_attr_t pthread_
>  typedef unsigned long __darwin_pthread_key_t;
>  typedef __darwin_pthread_key_t pthread_key_t;
>
> -int pthread_create(pthread_t *, const pthread_attr_t *,  // C-warning{{declaration of built-in function 'pthread_create' requires inclusion of the header <pthread.h>}}
> +int pthread_create(pthread_t *, const pthread_attr_t *,
>                     void *(*)(void *), void *);
>
>  int pthread_setspecific(pthread_key_t key, const void *value);
>
> Added: cfe/trunk/test/Sema/builtin-setjmp.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/builtin-setjmp.c?rev=367387&view=auto
> ==============================================================================
> --- cfe/trunk/test/Sema/builtin-setjmp.c (added)
> +++ cfe/trunk/test/Sema/builtin-setjmp.c Tue Jul 30 22:16:38 2019
> @@ -0,0 +1,10 @@
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify -DNO_JMP_BUF %s
> +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -verify %s
> +
> +#ifdef NO_JMP_BUF
> +extern long setjmp(long *);   // expected-warning {{declaration of built-in function 'setjmp' requires the declaration of the 'jmp_buf' type, commonly provided in the header <setjmp.h>.}}
> +#else
> +typedef long jmp_buf;
> +extern int setjmp(char);      // expected-warning at 8 {{incompatible redeclaration of library function 'setjmp'}}
> +                              // expected-note at 8    {{'setjmp' is a builtin with type 'int (jmp_buf)' (aka 'int (long)')}}
> +#endif
>
> Modified: cfe/trunk/test/Sema/implicit-builtin-decl.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/implicit-builtin-decl.c?rev=367387&r1=367386&r2=367387&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/implicit-builtin-decl.c (original)
> +++ cfe/trunk/test/Sema/implicit-builtin-decl.c Tue Jul 30 22:16:38 2019
> @@ -55,14 +55,17 @@ main(int argc, char *argv[])
>
>  void snprintf() { }
>
> -// PR8316
> -void longjmp(); // expected-warning{{declaration of built-in function 'longjmp' requires inclusion of the header <setjmp.h>}}
> +// PR8316 & PR40692
> +void longjmp(); // expected-warning{{declaration of built-in function 'longjmp' requires the declaration of the 'jmp_buf' type, commonly provided in the header <setjmp.h>.}}
>
>  extern float fmaxf(float, float);
>
>  struct __jmp_buf_tag {};
> -void sigsetjmp(struct __jmp_buf_tag[1], int); // expected-warning{{declaration of built-in function 'sigsetjmp' requires inclusion of the header <setjmp.h>}}
> +void sigsetjmp(struct __jmp_buf_tag[1], int); // expected-warning{{declaration of built-in function 'sigsetjmp' requires the declaration of the 'jmp_buf' type, commonly provided in the header <setjmp.h>.}}
>
>  // CHECK:     FunctionDecl {{.*}} <line:[[@LINE-2]]:1, col:44> col:6 sigsetjmp '
>  // CHECK-NOT: FunctionDecl
>  // CHECK:     ReturnsTwiceAttr {{.*}} <{{.*}}> Implicit
> +
> +// PR40692
> +void pthread_create(); // no warning expected
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list