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 [[email protected]]
> Sent: 28 February 2012 22:32
> To: James Molloy
> Cc: [email protected]
> 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: [email protected] [[email protected]] On 
>> Behalf Of Argyrios Kyrtzidis [[email protected]]
>> Sent: 28 February 2012 22:11
>> To: James Molloy
>> Cc: [email protected]
>> 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=151638&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/DiagnosticGroups.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/DiagnosticSemaKinds.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=151638&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.cpp?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&r1=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=151638&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
>>> [email protected]
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> [email protected]
>> 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.
> 

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to