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
