[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/ParseDecl.cpp lib/Sema/IdentifierResolver.cpp lib/Sema/Scope.cpp lib/Sema/Sema.cpp lib/Sema/SemaDecl.cpp test/CodeGen/decl-in-prototype.c test/Misc/warning-flags.c test/Sema/decl-in-prototype.c

Argyrios Kyrtzidis kyrtzidis at apple.com
Tue Feb 28 14:11:45 PST 2012


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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list