[cfe-commits] r151638 - in /cfe/trunk: include/clang/AST/Decl.h include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td include/clang/Sema/Scope.h include/clang/Sema/Sema.h lib/AST/Decl.cpp lib/AST/DumpXML.cpp lib/Parse/P...

James Molloy james.molloy at arm.com
Wed Feb 29 02:31:18 PST 2012


Argyrios (and list),

I've reapplied and fixed in r151712. Thanks for the simplified testcase,
seeing it showed me some flawed logic and also exposed another corner case I
had missed.

The diff between r151638 and r151712 (i.e. the fix that just went in) is
attached for reference.

Cheers,

James

-----Original Message-----
From: Argyrios Kyrtzidis [mailto:kyrtzidis at apple.com] 
Sent: 28 February 2012 23:50
To: James Molloy
Cc: cfe-commits at cs.uiuc.edu
Subject: Re: [cfe-commits] r151638 - in /cfe/trunk: include/clang/AST/Decl.h
include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td include/clang/Sema/Scope.h
include/clang/Sema/Sema.h lib/AST/Decl.cpp lib/AST/DumpXML.cpp
lib/Parse/P...

I reverted in r151667.

And here is a small test case that I just got, courtesy of Bill Wendling:

$ cat testcase.h
typedef long (*g) ();
enum {
  k = -1
};
void f() {}

$ clang -x c-header -arch x86_64 -std=gnu99 -c testcase.h
Assertion failed: (DeclIDs.find(D) != DeclIDs.end() && "Declaration not
emitted!"), function getDeclID, file
/Users/void/llvm/llvm-tot.src/tools/clang/lib/Serialization/ASTWriter.cpp,
line 3843.

-Argyrios

On Feb 28, 2012, at 3:00 PM, James Molloy wrote:

> Sure.
> 
> I'll recommit when I've found the fault and added a new testcase to cover
it.
> 
> Cheers,
> 
> James
> ________________________________________
> From: Argyrios Kyrtzidis [kyrtzidis at apple.com]
> Sent: 28 February 2012 22:32
> To: James Molloy
> Cc: cfe-commits at cs.uiuc.edu
> Subject: Re: [cfe-commits] r151638 - in /cfe/trunk:
include/clang/AST/Decl.h include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td include/clang/Sema/Scope.h
include/clang/Sema/Sema.h lib/AST/Decl.cpp lib/AST/DumpXML.cpp
lib/Parse/P...
> 
> On Feb 28, 2012, at 2:23 PM, James Molloy wrote:
> 
>> Argyrios,
>> 
>> I'll revert tomorrow morning and look at it, but:
> 
> Do you mind if I revert today ? This is blocking internal bots.
> 
>> 
>> (a) Have you got a test case that isn't Darwin-only?
> 
> I'll send you off-list a preprocessed file of cocoa.h
> 
>> (b) Why is this not covered by a regression test?
> 
> test/SemaObjC/cocoa.m can be enhanced to also test PCH; though it will
still be darwin-only.
> 
> -Argyrios
> 
>> 
>> Cheers,
>> 
>> James
>> ________________________________________
>> From: cfe-commits-bounces at cs.uiuc.edu [cfe-commits-bounces at cs.uiuc.edu]
On Behalf Of Argyrios Kyrtzidis [kyrtzidis at apple.com]
>> Sent: 28 February 2012 22:11
>> To: James Molloy
>> Cc: cfe-commits at cs.uiuc.edu
>> Subject: Re: [cfe-commits] r151638 - in /cfe/trunk:
include/clang/AST/Decl.h include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td include/clang/Sema/Scope.h
include/clang/Sema/Sema.h lib/AST/Decl.cpp lib/AST/DumpXML.cpp
lib/Parse/P...
>> 
>> This broke PCH creation:
>> 
>> $ cat cocoa.m
>> #import <Cocoa/Cocoa.h>
>> 
>> $ clang -x objective-c-header cocoa.m
>> Assertion failed: (DeclIDs.find(D) != DeclIDs.end() && "Declaration not
emitted!"), function getDeclID, file
/Users/argiris/proj/llvm/src/tools/clang/lib/Serialization/ASTWriter.cpp,
line 3843.
>> 0  clang             0x000000010d88727e _ZL15PrintStackTracePv + 46
>> 1  clang             0x000000010d887829 _ZL13SignalHandleri + 297
>> 2  libsystem_c.dylib 0x00007fff8f69acfa _sigtramp + 26
>> 3  libsystem_c.dylib 0x00000400fffffff8 _sigtramp + 18446607740451574552
>> 4  clang             0x000000010d88754b raise + 27
>> 5  clang             0x000000010d887602 abort + 18
>> 6  clang             0x000000010d8875e1 __assert_rtn + 129
>> 7  clang             0x000000010bacfec0
clang::ASTWriter::getDeclID(clang::Decl const*) + 240
>> 8  clang             0x000000010badf3a5 (anonymous
namespace)::ASTIdentifierTableTrait::EmitData(llvm::raw_ostream&,
clang::IdentifierInfo*, unsigned int, unsigned int) + 805
>> 9  clang             0x000000010bacf191
clang::OnDiskChainedHashTableGenerator<(anonymous
namespace)::ASTIdentifierTableTrait>::Emit(llvm::raw_ostream&, (anonymous
namespace)::ASTIdentifierTableTrait&) + 353
>> 10 clang             0x000000010bace9d8
clang::ASTWriter::WriteIdentifierTable(clang::Preprocessor&,
clang::IdentifierResolver&, bool) + 808
>> 11 clang             0x000000010bad6b2c
clang::ASTWriter::WriteASTCore(clang::Sema&, clang::MemorizeStatCalls*,
llvm::StringRef, std::string const&, clang::Module*) + 6652
>> 12 clang             0x000000010bad5101
clang::ASTWriter::WriteAST(clang::Sema&, clang::MemorizeStatCalls*,
std::string const&, clang::Module*, llvm::StringRef) + 257
>> 13 clang             0x000000010bb1124d
clang::PCHGenerator::HandleTranslationUnit(clang::ASTContext&) + 269
>> 14 clang             0x000000010bcb8aa4 clang::ParseAST(clang::Sema&,
bool) + 692
>> 15 clang             0x000000010b989f08
clang::ASTFrontendAction::ExecuteAction() + 264
>> 16 clang             0x000000010b989b57 clang::FrontendAction::Execute()
+ 231
>> 17 clang             0x000000010b953df5
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 821
>> 18 clang             0x000000010b9268df
clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 943
>> 19 clang             0x000000010b910529 cc1_main(char const**, char
const**, char const*, void*) + 969
>> 20 clang             0x000000010b9207cd main + 477
>> 21 clang             0x000000010b910134 start + 52
>> 
>> 
>> Please revert and investigate.
>> 
>> -Argyrios
>> 
>> On Feb 28, 2012, at 10:12 AM, James Molloy wrote:
>> 
>>> Author: jamesm
>>> Date: Tue Feb 28 12:12:11 2012
>>> New Revision: 151638
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=151638&view=rev
>>> Log:
>>> Correctly track tags and enum members defined in the prototype of a
function, and ensure they are properly scoped.
>>> 
>>> This fixes code such as:
>>> 
>>> enum e {x, y};
>>> int f(enum {y, x} n) {
>>> return 0;
>>> }
>>> 
>>> This finally fixes PR5464 and PR5477.
>>> 
>>> 
>>> Added:
>>>  cfe/trunk/test/CodeGen/decl-in-prototype.c   (with props)
>>>  cfe/trunk/test/Sema/decl-in-prototype.c   (with props)
>>> Modified:
>>>  cfe/trunk/include/clang/AST/Decl.h
>>>  cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>>  cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>>  cfe/trunk/include/clang/Sema/Scope.h
>>>  cfe/trunk/include/clang/Sema/Sema.h
>>>  cfe/trunk/lib/AST/Decl.cpp
>>>  cfe/trunk/lib/AST/DumpXML.cpp
>>>  cfe/trunk/lib/Parse/ParseDecl.cpp
>>>  cfe/trunk/lib/Sema/IdentifierResolver.cpp
>>>  cfe/trunk/lib/Sema/Scope.cpp
>>>  cfe/trunk/lib/Sema/Sema.cpp
>>>  cfe/trunk/lib/Sema/SemaDecl.cpp
>>>  cfe/trunk/test/Misc/warning-flags.c
>>> 
>>> Modified: cfe/trunk/include/clang/AST/Decl.h
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=1
51638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/include/clang/AST/Decl.h (original)
>>> +++ cfe/trunk/include/clang/AST/Decl.h Tue Feb 28 12:12:11 2012
>>> @@ -1431,6 +1431,11 @@
>>> /// no formals.
>>> ParmVarDecl **ParamInfo;
>>> 
>>> +  /// DeclsInPrototypeScope - Array of pointers to NamedDecls for
>>> +  /// decls defined in the function prototype that are not parameters.
E.g.
>>> +  /// 'enum Y' in 'void f(enum Y {AA} x) {}'.
>>> +  llvm::ArrayRef<NamedDecl*> DeclsInPrototypeScope;
>>> +
>>> LazyDeclStmtPtr Body;
>>> 
>>> // FIXME: This can be packed into the bitfields in Decl.
>>> @@ -1796,6 +1801,11 @@
>>>   setParams(getASTContext(), NewParamInfo);
>>> }
>>> 
>>> +  const llvm::ArrayRef<NamedDecl*> &getDeclsInPrototypeScope() const {
>>> +    return DeclsInPrototypeScope;
>>> +  }
>>> +  void setDeclsInPrototypeScope(llvm::ArrayRef<NamedDecl *> NewDecls);
>>> +
>>> /// getMinRequiredArguments - Returns the minimum number of arguments
>>> /// needed to call this function. This may be fewer than the number of
>>> /// function parameters, if some of the parameters have default
>>> 
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic
Groups.td?rev=151638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Tue Feb 28
12:12:11 2012
>>> @@ -244,6 +244,7 @@
>>> def VexingParse : DiagGroup<"vexing-parse">;
>>> def VLA : DiagGroup<"vla">;
>>> def VolatileRegisterVar : DiagGroup<"volatile-register-var">;
>>> +def Visibility : DiagGroup<"visibility">;
>>> 
>>> // GCC calls -Wdeprecated-writable-strings -Wwrite-strings.
>>> def GCCWriteStrings : DiagGroup<"write-strings" ,
[DeprecatedWritableStr]>;
>>> 
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic
SemaKinds.td?rev=151638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Feb 28
12:12:11 2012
>>> @@ -132,7 +132,11 @@
>>> def warn_unused_exception_param : Warning<"unused exception parameter
%0">,
>>> InGroup<UnusedExceptionParameter>, DefaultIgnore;
>>> def warn_decl_in_param_list : Warning<
>>> -  "declaration of %0 will not be visible outside of this function">;
>>> +  "declaration of %0 will not be visible outside of this function">,
>>> +  InGroup<Visibility>;
>>> +def warn_redefinition_in_param_list : Warning<
>>> +  "redefinition of %0 will not be visible outside of this function">,
>>> +  InGroup<Visibility>;
>>> def warn_empty_parens_are_function_decl : Warning<
>>> "empty parentheses interpreted as a function declaration">,
>>> InGroup<VexingParse>;
>>> 
>>> Modified: cfe/trunk/include/clang/Sema/Scope.h
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Scope.h?rev
=151638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/include/clang/Sema/Scope.h (original)
>>> +++ cfe/trunk/include/clang/Sema/Scope.h Tue Feb 28 12:12:11 2012
>>> @@ -297,6 +297,10 @@
>>> /// \brief Determine whether this scope is a C++ 'try' block.
>>> bool isTryScope() const { return getFlags() & Scope::TryScope; }
>>> 
>>> +  /// containedInPrototypeScope - Return true if this or a parent scope
>>> +  /// is a FunctionPrototypeScope.
>>> +  bool containedInPrototypeScope() const;
>>> +
>>> typedef UsingDirectivesTy::iterator udir_iterator;
>>> typedef UsingDirectivesTy::const_iterator const_udir_iterator;
>>> 
>>> 
>>> Modified: cfe/trunk/include/clang/Sema/Sema.h
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=
151638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/include/clang/Sema/Sema.h (original)
>>> +++ cfe/trunk/include/clang/Sema/Sema.h Tue Feb 28 12:12:11 2012
>>> @@ -902,6 +902,13 @@
>>> // Symbol table / Decl tracking callbacks: SemaDecl.cpp.
>>> //
>>> 
>>> +  /// List of decls defined in a function prototype. This contains
EnumConstants
>>> +  /// that incorrectly end up in translation unit scope because there
is no
>>> +  /// function to pin them on. ActOnFunctionDeclarator reads this list
and patches
>>> +  /// them into the FunctionDecl.
>>> +  std::vector<NamedDecl*> DeclsInPrototypeScope;
>>> +  bool InFunctionDeclarator;
>>> +
>>> DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType = 0);
>>> 
>>> void DiagnoseUseOfUnimplementedSelectors();
>>> @@ -1048,6 +1055,7 @@
>>> // Returns true if the variable declaration is a redeclaration
>>> bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous);
>>> void CheckCompleteVariableDeclaration(VarDecl *var);
>>> +  void ActOnStartFunctionDeclarator();
>>> NamedDecl* ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext*
DC,
>>>                                    TypeSourceInfo *TInfo,
>>>                                    LookupResult &Previous,
>>> 
>>> Modified: cfe/trunk/lib/AST/Decl.cpp
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=151638&r1
=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/lib/AST/Decl.cpp (original)
>>> +++ cfe/trunk/lib/AST/Decl.cpp Tue Feb 28 12:12:11 2012
>>> @@ -1847,6 +1847,16 @@
>>> }
>>> }
>>> 
>>> +void FunctionDecl::setDeclsInPrototypeScope(llvm::ArrayRef<NamedDecl *>
NewDecls) {
>>> +  assert(DeclsInPrototypeScope.empty() && "Already has prototype
decls!");
>>> +
>>> +  if (!NewDecls.empty()) {
>>> +    NamedDecl **A = new (getASTContext()) NamedDecl*[NewDecls.size()];
>>> +    std::copy(NewDecls.begin(), NewDecls.end(), A);
>>> +    DeclsInPrototypeScope = llvm::ArrayRef<NamedDecl*>(A,
NewDecls.size());
>>> +  }
>>> +}
>>> +
>>> /// getMinRequiredArguments - Returns the minimum number of arguments
>>> /// needed to call this function. This may be fewer than the number of
>>> /// function parameters, if some of the parameters have default
>>> 
>>> Modified: cfe/trunk/lib/AST/DumpXML.cpp
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DumpXML.cpp?rev=151638
&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/lib/AST/DumpXML.cpp (original)
>>> +++ cfe/trunk/lib/AST/DumpXML.cpp Tue Feb 28 12:12:11 2012
>>> @@ -497,6 +497,10 @@
>>>   for (FunctionDecl::param_iterator
>>>          I = D->param_begin(), E = D->param_end(); I != E; ++I)
>>>     dispatch(*I);
>>> +    for (llvm::ArrayRef<NamedDecl*>::iterator
>>> +           I = D->getDeclsInPrototypeScope().begin(), E =
D->getDeclsInPrototypeScope().end();
>>> +         I != E; ++I)
>>> +      dispatch(*I);
>>>   if (D->doesThisDeclarationHaveABody())
>>>     dispatch(D->getBody());
>>> }
>>> 
>>> Modified: cfe/trunk/lib/Parse/ParseDecl.cpp
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=15
1638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/lib/Parse/ParseDecl.cpp (original)
>>> +++ cfe/trunk/lib/Parse/ParseDecl.cpp Tue Feb 28 12:12:11 2012
>>> @@ -4226,6 +4226,8 @@
>>> ExprResult NoexceptExpr;
>>> ParsedType TrailingReturnType;
>>> 
>>> +  Actions.ActOnStartFunctionDeclarator();
>>> +
>>> SourceLocation EndLoc;
>>> if (isFunctionDeclaratorIdentifierList()) {
>>>   if (RequiresArg)
>>> 
>>> Modified: cfe/trunk/lib/Sema/IdentifierResolver.cpp
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/IdentifierResolver.cp
p?rev=151638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/lib/Sema/IdentifierResolver.cpp (original)
>>> +++ cfe/trunk/lib/Sema/IdentifierResolver.cpp Tue Feb 28 12:12:11 2012
>>> @@ -113,7 +113,7 @@
>>>                            bool ExplicitInstantiationOrSpecialization)
const {
>>> Ctx = Ctx->getRedeclContext();
>>> 
>>> -  if (Ctx->isFunctionOrMethod()) {
>>> +  if (Ctx->isFunctionOrMethod() || S->isFunctionPrototypeScope()) {
>>>   // Ignore the scopes associated within transparent declaration
contexts.
>>>   while (S->getEntity() &&
>>>          ((DeclContext *)S->getEntity())->isTransparentContext())
>>> 
>>> Modified: cfe/trunk/lib/Sema/Scope.cpp
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Scope.cpp?rev=151638&
r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/lib/Sema/Scope.cpp (original)
>>> +++ cfe/trunk/lib/Sema/Scope.cpp Tue Feb 28 12:12:11 2012
>>> @@ -59,3 +59,13 @@
>>> Entity = 0;
>>> ErrorTrap.reset();
>>> }
>>> +
>>> +bool Scope::containedInPrototypeScope() const {
>>> +  const Scope *S = this;
>>> +  while (S) {
>>> +    if (S->isFunctionPrototypeScope())
>>> +      return true;
>>> +    S = S->getParent();
>>> +  }
>>> +  return false;
>>> +}
>>> 
>>> Modified: cfe/trunk/lib/Sema/Sema.cpp
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=151638&r
1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/lib/Sema/Sema.cpp (original)
>>> +++ cfe/trunk/lib/Sema/Sema.cpp Tue Feb 28 12:12:11 2012
>>> @@ -94,7 +94,7 @@
>>>   ObjCShouldCallSuperDealloc(false),
>>>   ObjCShouldCallSuperFinalize(false),
>>>   TUKind(TUKind),
>>> -    NumSFINAEErrors(0), SuppressAccessChecking(false),
>>> +    NumSFINAEErrors(0), InFunctionDeclarator(false),
SuppressAccessChecking(false),
>>>   AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false),
>>>   NonInstantiationEntries(0), ArgumentPackSubstitutionIndex(-1),
>>>   CurrentInstantiationScope(0), TyposCorrected(0),
>>> 
>>> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=1516
38&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Feb 28 12:12:11 2012
>>> @@ -1249,6 +1249,10 @@
>>> }
>>> }
>>> 
>>> +void Sema::ActOnStartFunctionDeclarator() {
>>> +  InFunctionDeclarator = true;
>>> +}
>>> +
>>> /// \brief Look for an Objective-C class in the translation unit.
>>> ///
>>> /// \param Id The name of the Objective-C class we're looking for. If
>>> @@ -4810,6 +4814,8 @@
>>> 
>>> assert(R.getTypePtr()->isFunctionType());
>>> 
>>> +  InFunctionDeclarator = false;
>>> +
>>> // TODO: consider using NameInfo for diagnostic.
>>> DeclarationNameInfo NameInfo = GetNameForDeclarator(D);
>>> DeclarationName Name = NameInfo.getName();
>>> @@ -5241,6 +5247,15 @@
>>> // Finally, we know we have the right number of parameters, install
them.
>>> NewFD->setParams(Params);
>>> 
>>> +  // Find all anonymous symbols defined during the declaration of this
function
>>> +  // and add to NewFD. This lets us track decls such 'enum Y' in:
>>> +  //
>>> +  //   void f(enum Y {AA} x) {}
>>> +  //
>>> +  // which would otherwise incorrectly end up in the translation unit
scope.
>>> +  NewFD->setDeclsInPrototypeScope(DeclsInPrototypeScope);
>>> +  DeclsInPrototypeScope.clear();
>>> +
>>> // Process the non-inheritable attributes on this declaration.
>>> ProcessDeclAttributes(S, NewFD, D,
>>>                       /*NonInheritable=*/true, /*Inheritable=*/false);
>>> @@ -7225,6 +7240,43 @@
>>>   }
>>> }
>>> 
>>> +  // If we had any tags defined in the function prototype,
>>> +  // introduce them into the function scope.
>>> +  if (FnBodyScope) {
>>> +    for (llvm::ArrayRef<NamedDecl*>::iterator I =
FD->getDeclsInPrototypeScope().begin(),
>>> +           E = FD->getDeclsInPrototypeScope().end(); I != E; ++E) {
>>> +      NamedDecl *D = *I;
>>> +
>>> +      // Some of these decls (like enums) may have been pinned to the
translation unit
>>> +      // for lack of a real context earlier. If so, remove from the
translation unit
>>> +      // and reattach to the current context.
>>> +      if (D->getLexicalDeclContext() ==
Context.getTranslationUnitDecl()) {
>>> +        // Is the decl actually in the context?
>>> +        for (DeclContext::decl_iterator DI =
Context.getTranslationUnitDecl()->decls_begin(),
>>> +               DE = Context.getTranslationUnitDecl()->decls_end(); DI
!= DE; ++DI) {
>>> +          if (*DI == D) {
>>> +            Context.getTranslationUnitDecl()->removeDecl(D);
>>> +            break;
>>> +          }
>>> +        }
>>> +        // Either way, reassign the lexical decl context to our
FunctionDecl.
>>> +        D->setLexicalDeclContext(CurContext);
>>> +      }
>>> +
>>> +      // If the decl has a non-null name, make accessible in the
current scope.
>>> +      if (!D->getName().empty())
>>> +        PushOnScopeChains(D, FnBodyScope, /*AddToContext=*/false);
>>> +
>>> +      // Similarly, dive into enums and fish their constants out,
making them
>>> +      // accessible in this scope.
>>> +      if (EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
>>> +        for (EnumDecl::enumerator_iterator EI = ED->enumerator_begin(),
>>> +               EE = ED->enumerator_end(); EI != EE; ++EI)
>>> +          PushOnScopeChains(*EI, FnBodyScope, /*AddToContext=*/false);
>>> +      }
>>> +    }
>>> +  }
>>> +
>>> // Checking attributes of current function definition
>>> // dllimport attribute.
>>> DLLImportAttr *DA = FD->getAttr<DLLImportAttr>();
>>> @@ -8177,7 +8229,12 @@
>>>                 !isa<CXXRecordDecl>(Def) ||
>>>
cast<CXXRecordDecl>(Def)->getTemplateSpecializationKind()
>>>                                              ==
TSK_ExplicitSpecialization) {
>>> -                Diag(NameLoc, diag::err_redefinition) << Name;
>>> +                // A redeclaration in function prototype scope in C
isn't
>>> +                // visible elsewhere, so merely issue a warning.
>>> +                if (!getLangOptions().CPlusPlus &&
S->containedInPrototypeScope())
>>> +                  Diag(NameLoc, diag::warn_redefinition_in_param_list)
<< Name;
>>> +                else
>>> +                  Diag(NameLoc, diag::err_redefinition) << Name;
>>>               Diag(Def->getLocation(), diag::note_previous_definition);
>>>               // If this is a redefinition, recover by making this
>>>               // struct be anonymous, which will make any later
>>> @@ -8459,6 +8516,12 @@
>>>       II->isStr("FILE"))
>>>     Context.setFILEDecl(New);
>>> 
>>> +  // If we were in function prototype scope (and not in C++ mode), add
this
>>> +  // tag to the list of decls to inject into the function definition
scope.
>>> +  if (S->isFunctionPrototypeScope() && !getLangOptions().CPlusPlus &&
>>> +      InFunctionDeclarator && Name)
>>> +    DeclsInPrototypeScope.push_back(New);
>>> +
>>> OwnedDecl = true;
>>> return New;
>>> }
>>> @@ -10142,6 +10205,12 @@
>>> 
>>> Enum->completeDefinition(BestType, BestPromotionType,
>>>                          NumPositiveBits, NumNegativeBits);
>>> +
>>> +  // If we're declaring a function, ensure this decl isn't forgotten
about -
>>> +  // it needs to go into the function scope.
>>> +  if (InFunctionDeclarator)
>>> +    DeclsInPrototypeScope.push_back(Enum);
>>> +
>>> }
>>> 
>>> Decl *Sema::ActOnFileScopeAsmDecl(Expr *expr,
>>> 
>>> Added: cfe/trunk/test/CodeGen/decl-in-prototype.c
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/decl-in-prototype
.c?rev=151638&view=auto
>>>
============================================================================
==
>>> --- cfe/trunk/test/CodeGen/decl-in-prototype.c (added)
>>> +++ cfe/trunk/test/CodeGen/decl-in-prototype.c Tue Feb 28 12:12:11 2012
>>> @@ -0,0 +1,15 @@
>>> +// RUN: %clang -emit-llvm -S -o - %s | FileCheck %s
>>> +
>>> +const int AA = 5;
>>> +
>>> +// CHECK: define i32 @f1
>>> +int f1(enum {AA,BB} E) {
>>> +    // CHECK: ret i32 1
>>> +    return BB;
>>> +}
>>> +
>>> +// CHECK: define i32 @f2
>>> +int f2(enum {AA=7,BB} E) {
>>> +    // CHECK: ret i32 7
>>> +    return AA;
>>> +}
>>> 
>>> Propchange: cfe/trunk/test/CodeGen/decl-in-prototype.c
>>>
----------------------------------------------------------------------------
--
>>>  svn:eol-style = native
>>> 
>>> Modified: cfe/trunk/test/Misc/warning-flags.c
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Misc/warning-flags.c?rev=
151638&r1=151637&r2=151638&view=diff
>>>
============================================================================
==
>>> --- cfe/trunk/test/Misc/warning-flags.c (original)
>>> +++ cfe/trunk/test/Misc/warning-flags.c Tue Feb 28 12:12:11 2012
>>> @@ -17,7 +17,7 @@
>>> 
>>> The list of warnings below should NEVER grow.  It should gradually
shrink to 0.
>>> 
>>> -CHECK: Warnings without flags (257):
>>> +CHECK: Warnings without flags (256):
>>> CHECK-NEXT:   ext_anonymous_struct_union_qualified
>>> CHECK-NEXT:   ext_binary_literal
>>> CHECK-NEXT:   ext_cast_fn_obj
>>> @@ -137,7 +137,6 @@
>>> CHECK-NEXT:   warn_conv_to_self_not_used
>>> CHECK-NEXT:   warn_conv_to_void_not_used
>>> CHECK-NEXT:   warn_cxx0x_right_shift_in_template_arg
>>> -CHECK-NEXT:   warn_decl_in_param_list
>>> CHECK-NEXT:   warn_delete_array_type
>>> CHECK-NEXT:   warn_division_by_zero
>>> CHECK-NEXT:   warn_double_const_requires_fp64
>>> 
>>> Added: cfe/trunk/test/Sema/decl-in-prototype.c
>>> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/decl-in-prototype.c?
rev=151638&view=auto
>>>
============================================================================
==
>>> --- cfe/trunk/test/Sema/decl-in-prototype.c (added)
>>> +++ cfe/trunk/test/Sema/decl-in-prototype.c Tue Feb 28 12:12:11 2012
>>> @@ -0,0 +1,33 @@
>>> +// RUN: %clang_cc1_only -verify %s
>>> +
>>> +const int AA = 5;
>>> +
>>> +int f1(enum {AA,BB} E) {
>>> +    return BB;
>>> +}
>>> +
>>> +int f2(enum {AA=7,BB} E) {
>>> +    return AA;
>>> +}
>>> +
>>> +struct a {
>>> +};
>>> +
>>> +int f3(struct a { } *); // expected-warning {{will not be visible
outside of this function}}
>>> +
>>> +struct A { struct b { int j; } t; }; // expected-note {{previous
definition is here}}
>>> +
>>> +int f4(struct A { struct b { int j; } t; } *); // expected-warning
{{declaration of 'struct A' will not be visible outside of this function}}
expected-warning {{redefinition of 'b' will not be visible outside of this
function}}
>>> +
>>> +struct aA {
>>> +    struct ab { // expected-note {{previous definition is here}}
expected-note {{previous definition is here}}
>>> +        int j;
>>> +    } b;
>>> +};
>>> +
>>> +int f5(struct aA { struct ab { int j; } b; struct ab { char glorx; }
glorx; } *); // expected-warning {{declaration of 'struct aA' will not be
visible}} expected-warning {{redefinition of 'ab' will not be visible}}
expected-warning {{redefinition of 'ab' will not be visible}}
>>> +
>>> +void f6(struct z {int b;} c) { // expected-warning {{declaration of
'struct z' will not be visible outside of this function}}
>>> +    struct z d;
>>> +    d.b = 4;
>>> +}
>>> 
>>> Propchange: cfe/trunk/test/Sema/decl-in-prototype.c
>>>
----------------------------------------------------------------------------
--
>>>  svn:eol-style = native
>>> 
>>> 
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> 
>> 
>> -- IMPORTANT NOTICE: The contents of this email and any attachments are
confidential and may also be privileged. If you are not the intended
recipient, please notify the sender immediately and do not disclose the
contents to any other person, use it for any purpose, or store or copy the
information in any medium.  Thank you.
>> 
> 
> 
> 
> 
> -- IMPORTANT NOTICE: The contents of this email and any attachments are
confidential and may also be privileged. If you are not the intended
recipient, please notify the sender immediately and do not disclose the
contents to any other person, use it for any purpose, or store or copy the
information in any medium.  Thank you.
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: enum_prototypes_incr.diff
Type: application/octet-stream
Size: 4374 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120229/61e221e6/attachment.obj>


More information about the cfe-commits mailing list