Merged to release_90 in r367528.
On Wed, Jul 31, 2019 at 7:15 AM Johannes Doerfert via cfe-commits <cfe-commits@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@8 {{incompatible > redeclaration of library function 'setjmp'}} > + // expected-note@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@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits