Sema.cpp revision e91593ef084479340582b2ba177b44be50a717b7
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Sema.cpp - AST Builder and Semantic Analysis Implementation ------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the actions class which performs semantic analysis and 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// builds an AST out of a parse stream. 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "Sema.h" 165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/ASTContext.h" 17e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Expr.h" 185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Lex/Preprocessor.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/Diagnostic.h" 208ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff#include "clang/Parse/Scope.h" 2159907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekbool Sema::isBuiltinObjCType(TypedefDecl *TD) { 258ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff const char *typeName = TD->getIdentifier()->getName(); 268ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff return strcmp(typeName, "id") == 0 || strcmp(typeName, "Class") == 0 || 2766c5dfc193c4090b67c5effb0e80e287b94de17eFariborz Jahanian strcmp(typeName, "SEL") == 0 || strcmp(typeName, "Protocol") == 0; 28b216c8861c60af9c56c900a485233255c4452df2Steve Naroff} 29b216c8861c60af9c56c900a485233255c4452df2Steve Naroff 308ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroffvoid Sema::ActOnTranslationUnitScope(SourceLocation Loc, Scope *S) { 318ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff TUScope = S; 32ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis CurContext = Context.getTranslationUnitDecl(); 332ae34ed8caf90ca4044feca07811561053c08666Chris Lattner if (!PP.getLangOptions().ObjC1) return; 342ae34ed8caf90ca4044feca07811561053c08666Chris Lattner 3569d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff // Synthesize "typedef struct objc_selector *SEL;" 36b752f289026ad8e5f44851b20e009a27ed61eefcChris Lattner RecordDecl *SelTag = RecordDecl::Create(Context, TagDecl::TK_struct, 37b752f289026ad8e5f44851b20e009a27ed61eefcChris Lattner CurContext, 38c63e660882ff93841fa234d70ef6757038302b92Chris Lattner SourceLocation(), 396c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner &Context.Idents.get("objc_selector"), 40c63e660882ff93841fa234d70ef6757038302b92Chris Lattner 0); 4187f3ff0c27be71cfd0eaf4628eb64538e84ee6ceArgyrios Kyrtzidis PushOnScopeChains(SelTag, TUScope); 4269d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff 4369d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff QualType SelT = Context.getPointerType(Context.getTagDeclType(SelTag)); 440ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner TypedefDecl *SelTypedef = TypedefDecl::Create(Context, CurContext, 450ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation(), 466c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner &Context.Idents.get("SEL"), 47c63e660882ff93841fa234d70ef6757038302b92Chris Lattner SelT, 0); 4887f3ff0c27be71cfd0eaf4628eb64538e84ee6ceArgyrios Kyrtzidis PushOnScopeChains(SelTypedef, TUScope); 4969d6375dbd5f1efb9ffbb4a9e5c3f9aee746fed6Steve Naroff Context.setObjCSelType(SelTypedef); 506ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner 5127933c17617efe4902a7d4a9f52c751f85a7d92fChris Lattner // FIXME: Make sure these don't leak! 526ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner RecordDecl *ClassTag = RecordDecl::Create(Context, TagDecl::TK_struct, 536ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner CurContext, 546ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner SourceLocation(), 556ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("objc_class"), 566ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner 0); 576ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner QualType ClassT = Context.getPointerType(Context.getTagDeclType(ClassTag)); 586ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner TypedefDecl *ClassTypedef = 596ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner TypedefDecl::Create(Context, CurContext, SourceLocation(), 606ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("Class"), ClassT, 0); 616ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ClassTag, TUScope); 626ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ClassTypedef, TUScope); 636ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner Context.setObjCClassType(ClassTypedef); 646ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner // Synthesize "@class Protocol; 656ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner ObjCInterfaceDecl *ProtocolDecl = 66b752f289026ad8e5f44851b20e009a27ed61eefcChris Lattner ObjCInterfaceDecl::Create(Context, SourceLocation(), 676ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("Protocol"), 686ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner SourceLocation(), true); 696ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner Context.setObjCProtoType(Context.getObjCInterfaceType(ProtocolDecl)); 706ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ProtocolDecl, TUScope); 716ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner 726ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner // Synthesize "typedef struct objc_object { Class isa; } *id;" 736ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner RecordDecl *ObjectTag = 746ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner RecordDecl::Create(Context, TagDecl::TK_struct, CurContext, 756ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner SourceLocation(), 766ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("objc_object"), 0); 776ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner QualType ObjT = Context.getPointerType(Context.getTagDeclType(ObjectTag)); 786ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(ObjectTag, TUScope); 796ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner TypedefDecl *IdTypedef = TypedefDecl::Create(Context, CurContext, 806ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner SourceLocation(), 816ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner &Context.Idents.get("id"), 826ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner ObjT, 0); 836ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner PushOnScopeChains(IdTypedef, TUScope); 846ee1f9c0142e0c374f32fc86312630cd901247cfChris Lattner Context.setObjCIdType(IdTypedef); 85b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 863b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff 872ae34ed8caf90ca4044feca07811561053c08666Chris LattnerSema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer) 8853d0ea5f5bfa647ec23418bf3a3b7c183b51e4bdArgyrios Kyrtzidis : PP(pp), Context(ctxt), Consumer(consumer), CurContext(0) { 8959907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner 9059907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner // Get IdentifierInfo objects for known functions for which we 9159907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner // do extra checking. 922ae34ed8caf90ca4044feca07811561053c08666Chris Lattner IdentifierTable &IT = PP.getIdentifierTable(); 9359907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner 942ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_printf] = &IT.get("printf"); 952ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_fprintf] = &IT.get("fprintf"); 962ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_sprintf] = &IT.get("sprintf"); 972ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_snprintf] = &IT.get("snprintf"); 982ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_asprintf] = &IT.get("asprintf"); 997ff22b259d4d4729f701679e3a7f0e242365e07fTed Kremenek KnownFunctionIDs[id_NSLog] = &IT.get("NSLog"); 1002ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_vsnprintf] = &IT.get("vsnprintf"); 1012ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_vasprintf] = &IT.get("vasprintf"); 1022ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_vfprintf] = &IT.get("vfprintf"); 1032ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_vsprintf] = &IT.get("vsprintf"); 1042ae34ed8caf90ca4044feca07811561053c08666Chris Lattner KnownFunctionIDs[id_vprintf] = &IT.get("vprintf"); 1058ee529b5671295ea38c249df8b9d3766c905cfa7Steve Naroff 1063b950178e23b1fe65552996d7bfb7542d03f89daSteve Naroff TUScope = 0; 10707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis if (getLangOptions().CPlusPlus) 10807952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis FieldCollector.reset(new CXXFieldCollector()); 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1111e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast. 1121e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner/// If there is already an implicit cast, merge into the existing one. 1131e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattnervoid Sema::ImpCastExprToType(Expr *&Expr, QualType Type) { 114b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner if (Context.getCanonicalType(Expr->getType()) == 115b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner Context.getCanonicalType(Type)) return; 1161e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner 1171e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(Expr)) 1181e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner ImpCast->setType(Type); 1191e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner else 1201e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner Expr = new ImplicitCastExpr(Type, Expr); 1211e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner} 1221e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner 1231e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner 1241e0a39012467b4f409142c32148036a9ee05e1d7Chris Lattner 125394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattnervoid Sema::DeleteExpr(ExprTy *E) { 126394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner delete static_cast<Expr*>(E); 127394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner} 128394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattnervoid Sema::DeleteStmt(StmtTy *S) { 129394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner delete static_cast<Stmt*>(S); 130394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner} 131394a3fd57d2430f26dd1872cc7226437f5698e63Chris Lattner 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Helper functions. 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID) { 1379c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID); 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg) { 1429c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, &Msg, 1); 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const std::string &Msg2) { 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::string MsgArr[] = { Msg1, Msg2 }; 1499c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 2); 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, SourceRange Range) { 1549c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, 0, 0, &Range,1); 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg, 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceRange Range) { 1609c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, &Msg, 1, &Range,1); 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const std::string &Msg2, SourceRange Range) { 1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::string MsgArr[] = { Msg1, Msg2 }; 1679c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 2, &Range, 1); 1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1714667ac39be4a96725373c0317ad6827e1bb71502Chris Lattnerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg1, 1724667ac39be4a96725373c0317ad6827e1bb71502Chris Lattner const std::string &Msg2, const std::string &Msg3, 1734667ac39be4a96725373c0317ad6827e1bb71502Chris Lattner SourceRange R1) { 1744667ac39be4a96725373c0317ad6827e1bb71502Chris Lattner std::string MsgArr[] = { Msg1, Msg2, Msg3 }; 1754667ac39be4a96725373c0317ad6827e1bb71502Chris Lattner PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, MsgArr, 3, &R1, 1); 1764667ac39be4a96725373c0317ad6827e1bb71502Chris Lattner return true; 1774667ac39be4a96725373c0317ad6827e1bb71502Chris Lattner} 1784667ac39be4a96725373c0317ad6827e1bb71502Chris Lattner 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, 1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceRange R1, SourceRange R2) { 1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceRange RangeArr[] = { R1, R2 }; 1829c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, 0, 0, RangeArr, 2); 1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Loc, unsigned DiagID, const std::string &Msg, 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceRange R1, SourceRange R2) { 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceRange RangeArr[] = { R1, R2 }; 1899c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Loc), DiagID, &Msg, 1, RangeArr, 2); 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Sema::Diag(SourceLocation Range, unsigned DiagID, const std::string &Msg1, 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer const std::string &Msg2, SourceRange R1, SourceRange R2) { 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer std::string MsgArr[] = { Msg1, Msg2 }; 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer SourceRange RangeArr[] = { R1, R2 }; 1979c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek PP.getDiagnostics().Report(PP.getFullLoc(Range),DiagID, MsgArr,2,RangeArr, 2); 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst LangOptions &Sema::getLangOptions() const { 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return PP.getLangOptions(); 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 204