Argyrios,

I'll revert tomorrow morning and look at it, but:

(a) Have you got a test case that isn't Darwin-only?
(b) Why is this not covered by a regression test?

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