I reverted in r151667.
And here is a small test case that I just got, courtesy of Bill Wendling:
$ cat testcase.h
typedef long (*g) ();
enum {
k = -1
};
void f() {}
$ clang -x c-header -arch x86_64 -std=gnu99 -c testcase.h
Assertion failed: (DeclIDs.find(D) != DeclIDs.end() && "Declaration not
emitted!"), function getDeclID, file
/Users/void/llvm/llvm-tot.src/tools/clang/lib/Serialization/ASTWriter.cpp, line
3843.
-Argyrios
On Feb 28, 2012, at 3:00 PM, James Molloy wrote:
> Sure.
>
> I'll recommit when I've found the fault and added a new testcase to cover it.
>
> Cheers,
>
> James
> ________________________________________
> From: Argyrios Kyrtzidis [[email protected]]
> Sent: 28 February 2012 22:32
> 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...
>
> 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.
>>
>
>
>
>
> -- 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