[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...

Argyrios Kyrtzidis kyrtzidis at apple.com
Tue Feb 28 15:49:59 PST 2012


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=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
>>> 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.
> 




More information about the cfe-commits mailing list