[cfe-commits] r74027 - in /cfe/trunk: clang.xcodeproj/ clang.xcodeproj/project.pbxproj include/clang/AST/DeclCXX.h include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/Sema.h lib/Sema/SemaExpr.cpp lib/Sema/SemaStmt.cpp test/CXX/class/class.local/p1.cpp test/CXX/class/class.local/p3.cpp

Anders Carlsson andersca at mac.com
Tue Jun 23 17:56:53 PDT 2009


Hi Ted!

My main reason is that I like having an Xcode project that has only  
clang - this makes it easier to navigate (especially using command- 
option-d in Xcode) since there are fewer files, fewer declarations,  
etc. I never build from the project, so it doesn't need to be kept  
super up-to-date, and I volunteer to do so.

However, if there's strong consensus against having the xcode project  
in the repository, I could just use a private copy in my local trees.

Anders


23 jun 2009 kl. 17.53 skrev Ted Kremenek:

> I admit that I executed this badly.  I certainly should have sent an  
> email to the list before removing clang.xcodeproj.  For some reason  
> I felt I had already accounted for all the users of that project  
> file (who to my knowledge were now using cmake).
>
>
>
> On Jun 23, 2009, at 5:44 PM, Ted Kremenek <kremenek at apple.com> wrote:
>
>> Hi Anders,
>>
>> It would be really nice to drop clang.xcodeproj so that we aren't
>> maintaining a separate Xcode project.  Is there a particular issue  
>> you
>> have with the CMake generated Xcode project?
>>
>> Ted
>>
>> On Jun 23, 2009, at 5:10 PM, Anders Carlsson wrote:
>>
>>> Author: andersca
>>> Date: Tue Jun 23 19:10:43 2009
>>> New Revision: 74027
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=74027&view=rev
>>> Log:
>>> [class.local] p1 and p3. Also, add back the xcodeproj file.
>>>
>>> Added:
>>>  cfe/trunk/clang.xcodeproj/   (props changed)
>>>    - copied from r73959, cfe/trunk/clang.xcodeproj/
>>>  cfe/trunk/clang.xcodeproj/project.pbxproj
>>>    - copied unchanged from r73959, cfe/trunk/clang.xcodeproj/
>>> project.pbxproj
>>>  cfe/trunk/test/CXX/class/class.local/p1.cpp
>>>  cfe/trunk/test/CXX/class/class.local/p3.cpp
>>> Modified:
>>>  cfe/trunk/include/clang/AST/DeclCXX.h
>>>  cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>>  cfe/trunk/lib/Sema/Sema.h
>>>  cfe/trunk/lib/Sema/SemaExpr.cpp
>>>  cfe/trunk/lib/Sema/SemaStmt.cpp
>>>
>>> Propchange: cfe/trunk/clang.xcodeproj/
>>>
>>> ------------------------------------------------------------------------------
>>> --- svn:ignore (added)
>>> +++ svn:ignore Tue Jun 23 19:10:43 2009
>>> @@ -0,0 +1,2 @@
>>> +*.mode1
>>> +*.pbxuser
>>>
>>> Modified: cfe/trunk/include/clang/AST/DeclCXX.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=74027&r1=74026&r2=74027&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> = 
>>> ====================================================================
>>> --- cfe/trunk/include/clang/AST/DeclCXX.h (original)
>>> +++ cfe/trunk/include/clang/AST/DeclCXX.h Tue Jun 23 19:10:43 2009
>>> @@ -449,6 +449,15 @@
>>> /// getDestructor - Returns the destructor decl for this class.
>>> const CXXDestructorDecl *getDestructor(ASTContext &Context);
>>>
>>> +  /// isLocalClass - If the class is a local class [class.local],
>>> returns
>>> +  /// the enclosing function declaration.
>>> +  const FunctionDecl *isLocalClass() const {
>>> +    if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>
>>> (getDeclContext()))
>>> +      return RD->isLocalClass();
>>> +
>>> +    return dyn_cast<FunctionDecl>(getDeclContext());
>>> +  }
>>> +
>>> /// viewInheritance - Renders and displays an inheritance diagram
>>> /// for this C++ class and all of its base classes (transitively)
>>> using
>>> /// GraphViz.
>>>
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=74027&r1=74026&r2=74027&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> = 
>>> ====================================================================
>>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Jun 23
>>> 19:10:43 2009
>>> @@ -1603,6 +1603,12 @@
>>> "anonymous %select{struct|union}0 cannot contain a "
>>> "%select{private|protected}1 data member">;
>>>
>>> +// C++ local classes
>>> +def err_reference_to_local_var_in_enclosing_function : Error<
>>> +  "reference to local variable %0 declared in enclosed function  
>>> %1">;
>>> +def note_local_variable_declared_here : Note<
>>> +  "%0 declared here">;
>>> +
>>> // C++ derived classes
>>> def err_base_clause_on_union : Error<"unions cannot have base
>>> classes">;
>>> def err_base_must_be_class : Error<"base specifier must name a
>>> class">;
>>>
>>> Modified: cfe/trunk/lib/Sema/Sema.h
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=74027&r1=74026&r2=74027&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> = 
>>> ====================================================================
>>> --- cfe/trunk/lib/Sema/Sema.h (original)
>>> +++ cfe/trunk/lib/Sema/Sema.h Tue Jun 23 19:10:43 2009
>>> @@ -1377,9 +1377,10 @@
>>>                                                   bool
>>> HasTrailingLParen,
>>>                                                   const
>>> CXXScopeSpec &SS,
>>>                                                   bool
>>> isAddressOfOperand);
>>> -  DeclRefExpr *BuildDeclRefExpr(NamedDecl *D, QualType Ty,
>>> SourceLocation Loc,
>>> -                                bool TypeDependent, bool
>>> ValueDependent,
>>> -                                const CXXScopeSpec *SS = 0);
>>> +  OwningExprResult BuildDeclRefExpr(NamedDecl *D, QualType Ty,
>>> +                                    SourceLocation Loc, bool
>>> TypeDependent,
>>> +                                    bool ValueDependent,
>>> +                                    const CXXScopeSpec *SS = 0);
>>> VarDecl *BuildAnonymousStructUnionMemberPath(FieldDecl *Field,
>>>                                   llvm::SmallVectorImpl<FieldDecl
>>> *> &Path);
>>> OwningExprResult
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=74027&r1=74026&r2=74027&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> = 
>>> ====================================================================
>>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jun 23 19:10:43 2009
>>> @@ -623,17 +623,36 @@
>>> /// BuildDeclRefExpr - Build either a DeclRefExpr or a
>>> /// QualifiedDeclRefExpr based on whether or not SS is a
>>> /// nested-name-specifier.
>>> -DeclRefExpr *
>>> +Sema::OwningExprResult
>>> Sema::BuildDeclRefExpr(NamedDecl *D, QualType Ty, SourceLocation  
>>> Loc,
>>>                      bool TypeDependent, bool ValueDependent,
>>>                      const CXXScopeSpec *SS) {
>>> +
>>> +  if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
>>> +    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>
>>> (CurContext)) {
>>> +      if (const FunctionDecl *FD = MD->getParent()->isLocalClass 
>>> ()) {
>>> +        if (VD->hasLocalStorage() && VD->getDeclContext() !=
>>> CurContext) {
>>> +          Diag(Loc,
>>> diag::err_reference_to_local_var_in_enclosing_function)
>>> +            << D->getIdentifier() << FD->getDeclName();
>>> +          Diag(D->getLocation(),
>>> diag::note_local_variable_declared_here)
>>> +            << D->getIdentifier();
>>> +          return ExprError();
>>> +        }
>>> +      }
>>> +    }
>>> +  }
>>> +
>>> MarkDeclarationReferenced(Loc, D);
>>> +
>>> +  Expr *E;
>>> if (SS && !SS->isEmpty()) {
>>> -    return new (Context) QualifiedDeclRefExpr(D, Ty, Loc,
>>> TypeDependent,
>>> -                                              ValueDependent, SS-
>>>> getRange(),
>>> +    E = new (Context) QualifiedDeclRefExpr(D, Ty, Loc,  
>>> TypeDependent,
>>> +                                          ValueDependent, SS-
>>>> getRange(),
>>>                 static_cast<NestedNameSpecifier *>(SS->getScopeRep
>>> ()));
>>> } else
>>> -    return new (Context) DeclRefExpr(D, Ty, Loc, TypeDependent,
>>> ValueDependent);
>>> +    E = new (Context) DeclRefExpr(D, Ty, Loc, TypeDependent,
>>> ValueDependent);
>>> +
>>> +  return Owned(E);
>>> }
>>>
>>> /// getObjectForAnonymousRecordDecl - Retrieve the (unnamed) field  
>>> or
>>> @@ -968,7 +987,7 @@
>>>       // The pointer is type- and value-dependent if it points
>>> into something
>>>       // dependent.
>>>       bool Dependent = DC->isDependentContext();
>>> -        return Owned(BuildDeclRefExpr(D, DType, Loc, Dependent,
>>> Dependent, SS));
>>> +        return BuildDeclRefExpr(D, DType, Loc, Dependent,
>>> Dependent, SS);
>>>     }
>>>   }
>>> }
>>> @@ -1061,11 +1080,11 @@
>>>
>>> // Make the DeclRefExpr or BlockDeclRefExpr for the decl.
>>> if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>
>>> (D))
>>> -    return Owned(BuildDeclRefExpr(Ovl, Context.OverloadTy, Loc,
>>> -                                  false, false, SS));
>>> +    return BuildDeclRefExpr(Ovl, Context.OverloadTy, Loc,
>>> +                           false, false, SS);
>>> else if (TemplateDecl *Template = dyn_cast<TemplateDecl>(D))
>>> -    return Owned(BuildDeclRefExpr(Template, Context.OverloadTy,  
>>> Loc,
>>> -                                  false, false, SS));
>>> +    return BuildDeclRefExpr(Template, Context.OverloadTy, Loc,
>>> +                            false, false, SS);
>>> ValueDecl *VD = cast<ValueDecl>(D);
>>>
>>> // Check whether this declaration can be used. Note that we suppress
>>> @@ -1113,7 +1132,7 @@
>>>     QualType NoProtoType = T;
>>>     if (const FunctionProtoType *Proto = T->getAsFunctionProtoType
>>> ())
>>>       NoProtoType = Context.getFunctionNoProtoType(Proto-
>>>> getResultType());
>>> -      return Owned(BuildDeclRefExpr(VD, NoProtoType, Loc, false,
>>> false, SS));
>>> +      return BuildDeclRefExpr(VD, NoProtoType, Loc, false, false,
>>> SS);
>>>   }
>>> }
>>>
>>> @@ -1194,8 +1213,8 @@
>>>   }
>>> }
>>>
>>> -  return Owned(BuildDeclRefExpr(VD, VD->getType
>>> ().getNonReferenceType(), Loc,
>>> -                                TypeDependent, ValueDependent,  
>>> SS));
>>> +  return BuildDeclRefExpr(VD, VD->getType().getNonReferenceType(),
>>> Loc,
>>> +                          TypeDependent, ValueDependent, SS);
>>> }
>>>
>>> Sema::OwningExprResult Sema::ActOnPredefinedExpr(SourceLocation Loc,
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=74027&r1=74026&r2=74027&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> = 
>>> ====================================================================
>>> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Tue Jun 23 19:10:43 2009
>>> @@ -835,6 +835,7 @@
>>>
>>> Action::OwningStmtResult
>>> Sema::ActOnReturnStmt(SourceLocation ReturnLoc, FullExprArg rex) {
>>> +  bool RetValExprIsValid = !rex->isInvalid();
>>> Expr *RetValExp = rex->takeAs<Expr>();
>>> if (CurBlock)
>>>   return ActOnBlockReturnStmt(ReturnLoc, RetValExp);
>>>
>>> Added: cfe/trunk/test/CXX/class/class.local/p1.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class/class.local/p1.cpp?rev=74027&view=auto
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> = 
>>> ====================================================================
>>> --- cfe/trunk/test/CXX/class/class.local/p1.cpp (added)
>>> +++ cfe/trunk/test/CXX/class/class.local/p1.cpp Tue Jun 23 19:10:43
>>> 2009
>>> @@ -0,0 +1,18 @@
>>> +// RUN: clang-cc -fsyntax-only -verify %s
>>> +
>>> +int x;
>>> +void f()
>>> +{
>>> +  static int s;
>>> +  int x; // expected-note{{'x' declared here}}
>>> +  extern int g();
>>> +
>>> +  struct local {
>>> +    int g() { return x; } // expected-error{{reference to local
>>> variable 'x' declared in enclosed function 'f'}}
>>> +    int h() { return s; }
>>> +    int k() { return :: x; }
>>> +    int l() { return g(); }
>>> +  };
>>> +}
>>> +
>>> +local* p = 0; // expected-error{{unknown type name 'local'}}
>>>
>>> Added: cfe/trunk/test/CXX/class/class.local/p3.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/class/class.local/p3.cpp?rev=74027&view=auto
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> = 
>>> = 
>>> ====================================================================
>>> --- cfe/trunk/test/CXX/class/class.local/p3.cpp (added)
>>> +++ cfe/trunk/test/CXX/class/class.local/p3.cpp Tue Jun 23 19:10:43
>>> 2009
>>> @@ -0,0 +1,30 @@
>>> +// RUN: clang-cc -fsyntax-only -verify %s
>>> +
>>> +void f1() {
>>> +  struct X {
>>> +    struct Y;
>>> +  };
>>> +
>>> +  struct X::Y {
>>> +    void f() {}
>>> +  };
>>> +}
>>> +
>>> +void f2() {
>>> +  struct X {
>>> +    struct Y;
>>> +
>>> +    struct Y {
>>> +      void f() {}
>>> +    };
>>> +  };
>>> +}
>>> +
>>> +// A class nested within a local class is a local class.
>>> +void f3(int a) { // expected-note{{'a' declared here}}
>>> +  struct X {
>>> +    struct Y {
>>> +      int f() { return a; } // expected-error{{reference to local
>>> variable 'a' declared in enclosed function 'f3'}}
>>> +    };
>>> +  };
>>> +}
>>> \ No newline at end of file
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>> _______________________________________________
>> 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