Merged to 6.0 in r325104 as suggested in PR36368.
On Thu, Feb 1, 2018 at 9:01 PM, Richard Smith via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: rsmith > Date: Thu Feb 1 12:01:49 2018 > New Revision: 323998 > > URL: http://llvm.org/viewvc/llvm-project?rev=323998&view=rev > Log: > PR36157: When injecting an implicit function declaration in C89, find the > right > DeclContext rather than injecting it wherever we happen to be. > > This avoids creating functions whose DeclContext is a struct or similar. > > Added: > cfe/trunk/test/Sema/cxx-as-c.c > Modified: > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/test/Sema/bitfield.c > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=323998&r1=323997&r2=323998&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Feb 1 12:01:49 2018 > @@ -12910,10 +12910,20 @@ void Sema::ActOnFinishDelayedAttribute(S > /// call, forming a call to an implicitly defined function (per C99 6.5.1p2). > NamedDecl *Sema::ImplicitlyDefineFunction(SourceLocation Loc, > IdentifierInfo &II, Scope *S) { > + // Find the scope in which the identifier is injected and the corresponding > + // DeclContext. > + // FIXME: C89 does not say what happens if there is no enclosing block > scope. > + // In that case, we inject the declaration into the translation unit scope > + // instead. > Scope *BlockScope = S; > while (!BlockScope->isCompoundStmtScope() && BlockScope->getParent()) > BlockScope = BlockScope->getParent(); > > + Scope *ContextScope = BlockScope; > + while (!ContextScope->getEntity()) > + ContextScope = ContextScope->getParent(); > + ContextRAII SavedContext(*this, ContextScope->getEntity()); > + > // Before we produce a declaration for an implicitly defined > // function, see whether there was a locally-scoped declaration of > // this name as a function or variable. If so, use that > > Modified: cfe/trunk/test/Sema/bitfield.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/bitfield.c?rev=323998&r1=323997&r2=323998&view=diff > ============================================================================== > --- cfe/trunk/test/Sema/bitfield.c (original) > +++ cfe/trunk/test/Sema/bitfield.c Thu Feb 1 12:01:49 2018 > @@ -82,3 +82,7 @@ typedef __typeof__(+(t5.n--)) Unsigned; > struct Test6 { > : 0.0; // expected-error{{type name requires a specifier or qualifier}} > }; > + > +struct PR36157 { > + int n : 1 ? 1 : implicitly_declare_function(); // expected-warning > {{invalid in C99}} > +}; > > Added: cfe/trunk/test/Sema/cxx-as-c.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/cxx-as-c.c?rev=323998&view=auto > ============================================================================== > --- cfe/trunk/test/Sema/cxx-as-c.c (added) > +++ cfe/trunk/test/Sema/cxx-as-c.c Thu Feb 1 12:01:49 2018 > @@ -0,0 +1,9 @@ > +// RUN: %clang_cc1 %s -verify > + > +// PR36157 > +struct Foo { > + Foo(int n) : n_(n) {} // expected-error 1+{{}} expected-warning 1+{{}} > +private: > + int n; > +}; > +int main() { Foo f; } // expected-error 1+{{}} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits