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
