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 <[email protected]> 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 >> [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 _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
