[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