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

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

Reply via email to