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