[cfe-commits] r39159 - in /cfe/cfe/trunk: AST/Sema.cpp AST/Sema.h AST/SemaDecl.cpp AST/SemaExpr.cpp Sema/Sema.cpp Sema/Sema.h Sema/SemaDecl.cpp Sema/SemaExpr.cpp

sabre at cs.uiuc.edu sabre at cs.uiuc.edu
Wed Jul 11 09:40:10 PDT 2007


Author: sabre
Date: Wed Jul 11 11:40:09 2007
New Revision: 39159

URL: http://llvm.org/viewvc/llvm-project?rev=39159&view=rev
Log:
move the rest of the expr sema to SemaExpr.cpp and the decl processing stuff
to SemaDecl.cpp

Modified:
    cfe/cfe/trunk/AST/Sema.cpp
    cfe/cfe/trunk/AST/Sema.h
    cfe/cfe/trunk/AST/SemaDecl.cpp
    cfe/cfe/trunk/AST/SemaExpr.cpp
    cfe/cfe/trunk/Sema/Sema.cpp
    cfe/cfe/trunk/Sema/Sema.h
    cfe/cfe/trunk/Sema/SemaDecl.cpp
    cfe/cfe/trunk/Sema/SemaExpr.cpp

Modified: cfe/cfe/trunk/AST/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/Sema.cpp?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/Sema.cpp (original)
+++ cfe/cfe/trunk/AST/Sema.cpp Wed Jul 11 11:40:09 2007
@@ -31,233 +31,3 @@
 }
 
 
-//===----------------------------------------------------------------------===//
-// Symbol table tracking callbacks.
-//===----------------------------------------------------------------------===//
-
-bool Sema::isTypeName(const IdentifierInfo &II, Scope *S) const {
-  Decl *D = II.getFETokenInfo<Decl>();
-  return D != 0 && D->getDeclSpec().StorageClassSpec == DeclSpec::SCS_typedef;
-}
-
-Action::DeclTy *
-Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init, 
-                      DeclTy *LastInGroup) {
-  IdentifierInfo *II = D.getIdentifier();
-  Decl *PrevDecl = II ? II->getFETokenInfo<Decl>() : 0;
-
-  Decl *New;
-  if (D.isFunctionDeclarator())
-    New = new FunctionDecl(II, D, PrevDecl);
-  else
-    New = new VarDecl(II, D, PrevDecl);
-  
-  // If this has an identifier, add it to the scope stack.
-  if (II) {
-    // If PrevDecl includes conflicting name here, emit a diagnostic.
-    II->setFETokenInfo(New);
-    S->AddDecl(II);
-  }
-  
-  // If this is a top-level decl that is chained to some other (e.g. int A,B,C;)
-  // remember this in the LastInGroupList list.
-  if (LastInGroup && S->getParent() == 0)
-    LastInGroupList.push_back((Decl*)LastInGroup);
-  
-  return New;
-}
-
-Action::DeclTy *
-Sema::ParseFunctionDefinition(Scope *S, Declarator &D, StmtTy *Body) {
-  FunctionDecl *FD = (FunctionDecl *)ParseDeclarator(S, D, 0, 0);
-  
-  FD->setBody((Stmt*)Body);
-
-  return FD;
-}
-
-void Sema::PopScope(SourceLocation Loc, Scope *S) {
-  for (Scope::decl_iterator I = S->decl_begin(), E = S->decl_end();
-       I != E; ++I) {
-    IdentifierInfo &II = *static_cast<IdentifierInfo*>(*I);
-    Decl *D = II.getFETokenInfo<Decl>();
-    assert(D && "This decl didn't get pushed??");
-    
-    Decl *Next = D->getNext();
-
-    // FIXME: Push the decl on the parent function list if in a function.
-    delete D;
-    
-    II.setFETokenInfo(Next);
-  }
-}
-
-//===--------------------------------------------------------------------===//
-// Expression Parsing Callbacks.
-//===--------------------------------------------------------------------===//
-
-Action::ExprResult Sema::ParseSimplePrimaryExpr(SourceLocation Loc,
-                                                tok::TokenKind Kind) {
-  switch (Kind) {
-  default:
-    assert(0 && "Unknown simple primary expr!");
-  case tok::identifier: {
-    // Could be enum-constant or decl.
-    //Tok.getIdentifierInfo()
-    return new DeclRefExpr(*(Decl*)0);
-  }
-    
-  case tok::char_constant:     // constant: character-constant
-  case tok::kw___func__:       // primary-expression: __func__ [C99 6.4.2.2]
-  case tok::kw___FUNCTION__:   // primary-expression: __FUNCTION__ [GNU]
-  case tok::kw___PRETTY_FUNCTION__:  // primary-expression: __P..Y_F..N__ [GNU]
-    //assert(0 && "FIXME: Unimp so far!");
-    return new DeclRefExpr(*(Decl*)0);
-  }
-}
-
-Action::ExprResult Sema::ParseIntegerConstant(SourceLocation Loc) {
-  return new IntegerConstant();
-}
-Action::ExprResult Sema::ParseFloatingConstant(SourceLocation Loc) {
-  return new FloatingConstant();
-}
-
-Action::ExprResult Sema::ParseParenExpr(SourceLocation L, SourceLocation R,
-                                        ExprTy *Val) {
-  return Val;
-}
-
-
-// Unary Operators.  'Tok' is the token for the operator.
-Action::ExprResult Sema::ParseUnaryOp(SourceLocation OpLoc, tok::TokenKind Op,
-                                      ExprTy *Input) {
-  UnaryOperator::Opcode Opc;
-  switch (Op) {
-  default: assert(0 && "Unknown unary op!");
-  case tok::plusplus:     Opc = UnaryOperator::PreInc; break;
-  case tok::minusminus:   Opc = UnaryOperator::PreDec; break;
-  case tok::amp:          Opc = UnaryOperator::AddrOf; break;
-  case tok::star:         Opc = UnaryOperator::Deref; break;
-  case tok::plus:         Opc = UnaryOperator::Plus; break;
-  case tok::minus:        Opc = UnaryOperator::Minus; break;
-  case tok::tilde:        Opc = UnaryOperator::Not; break;
-  case tok::exclaim:      Opc = UnaryOperator::LNot; break;
-  case tok::kw_sizeof:    Opc = UnaryOperator::SizeOf; break;
-  case tok::kw___alignof: Opc = UnaryOperator::AlignOf; break;
-  case tok::kw___real:    Opc = UnaryOperator::Real; break;
-  case tok::kw___imag:    Opc = UnaryOperator::Imag; break;
-  case tok::ampamp:       Opc = UnaryOperator::AddrLabel; break;
-  case tok::kw___extension__: 
-    return Input;
-    //Opc = UnaryOperator::Extension;
-    //break;
-  }
-
-  return new UnaryOperator((Expr*)Input, Opc);
-}
-
-Action::ExprResult Sema::
-ParseSizeOfAlignOfTypeExpr(SourceLocation OpLoc, bool isSizeof, 
-                           SourceLocation LParenLoc, TypeTy *Ty,
-                           SourceLocation RParenLoc) {
-  return new SizeOfAlignOfTypeExpr(isSizeof, (Type*)Ty);
-}
-
-
-Action::ExprResult Sema::ParsePostfixUnaryOp(SourceLocation OpLoc, 
-                                             tok::TokenKind Kind,
-                                             ExprTy *Input) {
-  UnaryOperator::Opcode Opc;
-  switch (Kind) {
-  default: assert(0 && "Unknown unary op!");
-  case tok::plusplus:   Opc = UnaryOperator::PostInc; break;
-  case tok::minusminus: Opc = UnaryOperator::PostDec; break;
-  }
-  
-  return new UnaryOperator((Expr*)Input, Opc);
-}
-
-Action::ExprResult Sema::
-ParseArraySubscriptExpr(ExprTy *Base, SourceLocation LLoc,
-                        ExprTy *Idx, SourceLocation RLoc) {
-  return new ArraySubscriptExpr((Expr*)Base, (Expr*)Idx);
-}
-
-Action::ExprResult Sema::
-ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
-                         tok::TokenKind OpKind, SourceLocation MemberLoc,
-                         IdentifierInfo &Member) {
-  Decl *MemberDecl = 0;
-  // TODO: Look up MemberDecl.
-  return new MemberExpr((Expr*)Base, OpKind == tok::arrow, MemberDecl);
-}
-
-/// ParseCallExpr - Handle a call to Fn with the specified array of arguments.
-/// This provides the location of the left/right parens and a list of comma
-/// locations.
-Action::ExprResult Sema::
-ParseCallExpr(ExprTy *Fn, SourceLocation LParenLoc,
-              ExprTy **Args, unsigned NumArgs,
-              SourceLocation *CommaLocs, SourceLocation RParenLoc) {
-  return new CallExpr((Expr*)Fn, (Expr**)Args, NumArgs);
-}
-
-Action::ExprResult Sema::
-ParseCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
-              SourceLocation RParenLoc, ExprTy *Op) {
-  return new CastExpr((Type*)Ty, (Expr*)Op);
-}
-
-
-
-// Binary Operators.  'Tok' is the token for the operator.
-Action::ExprResult Sema::ParseBinOp(SourceLocation TokLoc, tok::TokenKind Kind,
-                                    ExprTy *LHS, ExprTy *RHS) {
-  BinaryOperator::Opcode Opc;
-  switch (Kind) {
-  default: assert(0 && "Unknown binop!");
-  case tok::star:                 Opc = BinaryOperator::Mul; break;
-  case tok::slash:                Opc = BinaryOperator::Div; break;
-  case tok::percent:              Opc = BinaryOperator::Rem; break;
-  case tok::plus:                 Opc = BinaryOperator::Add; break;
-  case tok::minus:                Opc = BinaryOperator::Sub; break;
-  case tok::lessless:             Opc = BinaryOperator::Shl; break;
-  case tok::greatergreater:       Opc = BinaryOperator::Shr; break;
-  case tok::lessequal:            Opc = BinaryOperator::LE; break;
-  case tok::less:                 Opc = BinaryOperator::LT; break;
-  case tok::greaterequal:         Opc = BinaryOperator::GE; break;
-  case tok::greater:              Opc = BinaryOperator::GT; break;
-  case tok::exclaimequal:         Opc = BinaryOperator::NE; break;
-  case tok::equalequal:           Opc = BinaryOperator::EQ; break;
-  case tok::amp:                  Opc = BinaryOperator::And; break;
-  case tok::caret:                Opc = BinaryOperator::Xor; break;
-  case tok::pipe:                 Opc = BinaryOperator::Or; break;
-  case tok::ampamp:               Opc = BinaryOperator::LAnd; break;
-  case tok::pipepipe:             Opc = BinaryOperator::LOr; break;
-  case tok::equal:                Opc = BinaryOperator::Assign; break;
-  case tok::starequal:            Opc = BinaryOperator::MulAssign; break;
-  case tok::slashequal:           Opc = BinaryOperator::DivAssign; break;
-  case tok::percentequal:         Opc = BinaryOperator::RemAssign; break;
-  case tok::plusequal:            Opc = BinaryOperator::AddAssign; break;
-  case tok::minusequal:           Opc = BinaryOperator::SubAssign; break;
-  case tok::lesslessequal:        Opc = BinaryOperator::ShlAssign; break;
-  case tok::greatergreaterequal:  Opc = BinaryOperator::ShrAssign; break;
-  case tok::ampequal:             Opc = BinaryOperator::AndAssign; break;
-  case tok::caretequal:           Opc = BinaryOperator::XorAssign; break;
-  case tok::pipeequal:            Opc = BinaryOperator::OrAssign; break;
-  case tok::comma:                Opc = BinaryOperator::Comma; break;
-  }
-  
-  return new BinaryOperator((Expr*)LHS, (Expr*)RHS, Opc);
-}
-
-/// ParseConditionalOp - Parse a ?: operation.  Note that 'LHS' may be null
-/// in the case of a the GNU conditional expr extension.
-Action::ExprResult Sema::ParseConditionalOp(SourceLocation QuestionLoc, 
-                                            SourceLocation ColonLoc,
-                                            ExprTy *Cond, ExprTy *LHS,
-                                            ExprTy *RHS) {
-  return new ConditionalOperator((Expr*)Cond, (Expr*)LHS, (Expr*)RHS);
-}
-

Modified: cfe/cfe/trunk/AST/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/Sema.h?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/Sema.h (original)
+++ cfe/cfe/trunk/AST/Sema.h Wed Jul 11 11:40:09 2007
@@ -41,7 +41,7 @@
             const std::string &Msg = std::string());
   
   //===--------------------------------------------------------------------===//
-  // Symbol table tracking callbacks.
+  // Symbol table / Decl tracking callbacks: SemaDecl.cpp.
   //
   virtual bool isTypeName(const IdentifierInfo &II, Scope *S) const;
   virtual DeclTy *ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init,
@@ -51,7 +51,7 @@
   virtual void PopScope(SourceLocation Loc, Scope *S);
   
   //===--------------------------------------------------------------------===//
-  // Statement Parsing Callbacks.
+  // Statement Parsing Callbacks: SemaStmt.cpp.
 
   virtual StmtResult ParseCompoundStmt(SourceLocation L, SourceLocation R,
                                        StmtTy **Elts, unsigned NumElts);
@@ -93,7 +93,7 @@
                                      ExprTy *RetValExp);
   
   //===--------------------------------------------------------------------===//
-  // Expression Parsing Callbacks.
+  // Expression Parsing Callbacks: SemaExpr.cpp.
 
   // Primary Expressions.
   virtual ExprResult ParseSimplePrimaryExpr(SourceLocation Loc,

Modified: cfe/cfe/trunk/AST/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/SemaDecl.cpp?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/SemaDecl.cpp (original)
+++ cfe/cfe/trunk/AST/SemaDecl.cpp Wed Jul 11 11:40:09 2007
@@ -11,8 +11,69 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "clang/Parse/Parser.h"
-#include "clang/Parse/SemaDeclSpec.h"
+#include "Sema.h"
+#include "clang/AST/Decl.h"
+#include "clang/Parse/Scope.h"
+#include "clang/Lex/IdentifierTable.h"
 using namespace llvm;
 using namespace clang;
 
+
+
+bool Sema::isTypeName(const IdentifierInfo &II, Scope *S) const {
+  Decl *D = II.getFETokenInfo<Decl>();
+  return D != 0 && D->getDeclSpec().StorageClassSpec == DeclSpec::SCS_typedef;
+}
+
+Action::DeclTy *
+Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init, 
+                      DeclTy *LastInGroup) {
+  IdentifierInfo *II = D.getIdentifier();
+  Decl *PrevDecl = II ? II->getFETokenInfo<Decl>() : 0;
+  
+  Decl *New;
+  if (D.isFunctionDeclarator())
+    New = new FunctionDecl(II, D, PrevDecl);
+  else
+    New = new VarDecl(II, D, PrevDecl);
+  
+  // If this has an identifier, add it to the scope stack.
+  if (II) {
+    // If PrevDecl includes conflicting name here, emit a diagnostic.
+    II->setFETokenInfo(New);
+    S->AddDecl(II);
+  }
+  
+  // If this is a top-level decl that is chained to some other (e.g. int A,B,C;)
+  // remember this in the LastInGroupList list.
+  if (LastInGroup && S->getParent() == 0)
+    LastInGroupList.push_back((Decl*)LastInGroup);
+  
+  return New;
+}
+
+Action::DeclTy *
+Sema::ParseFunctionDefinition(Scope *S, Declarator &D, StmtTy *Body) {
+  FunctionDecl *FD = (FunctionDecl *)ParseDeclarator(S, D, 0, 0);
+  
+  FD->setBody((Stmt*)Body);
+  
+  return FD;
+}
+
+void Sema::PopScope(SourceLocation Loc, Scope *S) {
+  for (Scope::decl_iterator I = S->decl_begin(), E = S->decl_end();
+       I != E; ++I) {
+    IdentifierInfo &II = *static_cast<IdentifierInfo*>(*I);
+    Decl *D = II.getFETokenInfo<Decl>();
+    assert(D && "This decl didn't get pushed??");
+    
+    Decl *Next = D->getNext();
+    
+    // FIXME: Push the decl on the parent function list if in a function.
+    delete D;
+    
+    II.setFETokenInfo(Next);
+  }
+}
+

Modified: cfe/cfe/trunk/AST/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/SemaExpr.cpp?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/SemaExpr.cpp (original)
+++ cfe/cfe/trunk/AST/SemaExpr.cpp Wed Jul 11 11:40:09 2007
@@ -237,3 +237,170 @@
   return new StringExpr(&ResultBuf[0], ResultPtr-&ResultBuf[0], AnyWide);
 }
 
+
+
+Action::ExprResult Sema::ParseSimplePrimaryExpr(SourceLocation Loc,
+                                                tok::TokenKind Kind) {
+  switch (Kind) {
+  default:
+    assert(0 && "Unknown simple primary expr!");
+  case tok::identifier: {
+    // Could be enum-constant or decl.
+    //Tok.getIdentifierInfo()
+    return new DeclRefExpr(*(Decl*)0);
+  }
+    
+  case tok::char_constant:     // constant: character-constant
+  case tok::kw___func__:       // primary-expression: __func__ [C99 6.4.2.2]
+  case tok::kw___FUNCTION__:   // primary-expression: __FUNCTION__ [GNU]
+  case tok::kw___PRETTY_FUNCTION__:  // primary-expression: __P..Y_F..N__ [GNU]
+    //assert(0 && "FIXME: Unimp so far!");
+    return new DeclRefExpr(*(Decl*)0);
+  }
+}
+
+Action::ExprResult Sema::ParseIntegerConstant(SourceLocation Loc) {
+  return new IntegerConstant();
+}
+Action::ExprResult Sema::ParseFloatingConstant(SourceLocation Loc) {
+  return new FloatingConstant();
+}
+
+Action::ExprResult Sema::ParseParenExpr(SourceLocation L, SourceLocation R,
+                                        ExprTy *Val) {
+  return Val;
+}
+
+
+// Unary Operators.  'Tok' is the token for the operator.
+Action::ExprResult Sema::ParseUnaryOp(SourceLocation OpLoc, tok::TokenKind Op,
+                                      ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Op) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:     Opc = UnaryOperator::PreInc; break;
+  case tok::minusminus:   Opc = UnaryOperator::PreDec; break;
+  case tok::amp:          Opc = UnaryOperator::AddrOf; break;
+  case tok::star:         Opc = UnaryOperator::Deref; break;
+  case tok::plus:         Opc = UnaryOperator::Plus; break;
+  case tok::minus:        Opc = UnaryOperator::Minus; break;
+  case tok::tilde:        Opc = UnaryOperator::Not; break;
+  case tok::exclaim:      Opc = UnaryOperator::LNot; break;
+  case tok::kw_sizeof:    Opc = UnaryOperator::SizeOf; break;
+  case tok::kw___alignof: Opc = UnaryOperator::AlignOf; break;
+  case tok::kw___real:    Opc = UnaryOperator::Real; break;
+  case tok::kw___imag:    Opc = UnaryOperator::Imag; break;
+  case tok::ampamp:       Opc = UnaryOperator::AddrLabel; break;
+  case tok::kw___extension__: 
+    return Input;
+    //Opc = UnaryOperator::Extension;
+    //break;
+  }
+
+  return new UnaryOperator((Expr*)Input, Opc);
+}
+
+Action::ExprResult Sema::
+ParseSizeOfAlignOfTypeExpr(SourceLocation OpLoc, bool isSizeof, 
+                           SourceLocation LParenLoc, TypeTy *Ty,
+                           SourceLocation RParenLoc) {
+  return new SizeOfAlignOfTypeExpr(isSizeof, (Type*)Ty);
+}
+
+
+Action::ExprResult Sema::ParsePostfixUnaryOp(SourceLocation OpLoc, 
+                                             tok::TokenKind Kind,
+                                             ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Kind) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:   Opc = UnaryOperator::PostInc; break;
+  case tok::minusminus: Opc = UnaryOperator::PostDec; break;
+  }
+  
+  return new UnaryOperator((Expr*)Input, Opc);
+}
+
+Action::ExprResult Sema::
+ParseArraySubscriptExpr(ExprTy *Base, SourceLocation LLoc,
+                        ExprTy *Idx, SourceLocation RLoc) {
+  return new ArraySubscriptExpr((Expr*)Base, (Expr*)Idx);
+}
+
+Action::ExprResult Sema::
+ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
+                         tok::TokenKind OpKind, SourceLocation MemberLoc,
+                         IdentifierInfo &Member) {
+  Decl *MemberDecl = 0;
+  // TODO: Look up MemberDecl.
+  return new MemberExpr((Expr*)Base, OpKind == tok::arrow, MemberDecl);
+}
+
+/// ParseCallExpr - Handle a call to Fn with the specified array of arguments.
+/// This provides the location of the left/right parens and a list of comma
+/// locations.
+Action::ExprResult Sema::
+ParseCallExpr(ExprTy *Fn, SourceLocation LParenLoc,
+              ExprTy **Args, unsigned NumArgs,
+              SourceLocation *CommaLocs, SourceLocation RParenLoc) {
+  return new CallExpr((Expr*)Fn, (Expr**)Args, NumArgs);
+}
+
+Action::ExprResult Sema::
+ParseCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
+              SourceLocation RParenLoc, ExprTy *Op) {
+  return new CastExpr((Type*)Ty, (Expr*)Op);
+}
+
+
+
+// Binary Operators.  'Tok' is the token for the operator.
+Action::ExprResult Sema::ParseBinOp(SourceLocation TokLoc, tok::TokenKind Kind,
+                                    ExprTy *LHS, ExprTy *RHS) {
+  BinaryOperator::Opcode Opc;
+  switch (Kind) {
+  default: assert(0 && "Unknown binop!");
+  case tok::star:                 Opc = BinaryOperator::Mul; break;
+  case tok::slash:                Opc = BinaryOperator::Div; break;
+  case tok::percent:              Opc = BinaryOperator::Rem; break;
+  case tok::plus:                 Opc = BinaryOperator::Add; break;
+  case tok::minus:                Opc = BinaryOperator::Sub; break;
+  case tok::lessless:             Opc = BinaryOperator::Shl; break;
+  case tok::greatergreater:       Opc = BinaryOperator::Shr; break;
+  case tok::lessequal:            Opc = BinaryOperator::LE; break;
+  case tok::less:                 Opc = BinaryOperator::LT; break;
+  case tok::greaterequal:         Opc = BinaryOperator::GE; break;
+  case tok::greater:              Opc = BinaryOperator::GT; break;
+  case tok::exclaimequal:         Opc = BinaryOperator::NE; break;
+  case tok::equalequal:           Opc = BinaryOperator::EQ; break;
+  case tok::amp:                  Opc = BinaryOperator::And; break;
+  case tok::caret:                Opc = BinaryOperator::Xor; break;
+  case tok::pipe:                 Opc = BinaryOperator::Or; break;
+  case tok::ampamp:               Opc = BinaryOperator::LAnd; break;
+  case tok::pipepipe:             Opc = BinaryOperator::LOr; break;
+  case tok::equal:                Opc = BinaryOperator::Assign; break;
+  case tok::starequal:            Opc = BinaryOperator::MulAssign; break;
+  case tok::slashequal:           Opc = BinaryOperator::DivAssign; break;
+  case tok::percentequal:         Opc = BinaryOperator::RemAssign; break;
+  case tok::plusequal:            Opc = BinaryOperator::AddAssign; break;
+  case tok::minusequal:           Opc = BinaryOperator::SubAssign; break;
+  case tok::lesslessequal:        Opc = BinaryOperator::ShlAssign; break;
+  case tok::greatergreaterequal:  Opc = BinaryOperator::ShrAssign; break;
+  case tok::ampequal:             Opc = BinaryOperator::AndAssign; break;
+  case tok::caretequal:           Opc = BinaryOperator::XorAssign; break;
+  case tok::pipeequal:            Opc = BinaryOperator::OrAssign; break;
+  case tok::comma:                Opc = BinaryOperator::Comma; break;
+  }
+  
+  return new BinaryOperator((Expr*)LHS, (Expr*)RHS, Opc);
+}
+
+/// ParseConditionalOp - Parse a ?: operation.  Note that 'LHS' may be null
+/// in the case of a the GNU conditional expr extension.
+Action::ExprResult Sema::ParseConditionalOp(SourceLocation QuestionLoc, 
+                                            SourceLocation ColonLoc,
+                                            ExprTy *Cond, ExprTy *LHS,
+                                            ExprTy *RHS) {
+  return new ConditionalOperator((Expr*)Cond, (Expr*)LHS, (Expr*)RHS);
+}
+

Modified: cfe/cfe/trunk/Sema/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/Sema.cpp?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/Sema.cpp (original)
+++ cfe/cfe/trunk/Sema/Sema.cpp Wed Jul 11 11:40:09 2007
@@ -31,233 +31,3 @@
 }
 
 
-//===----------------------------------------------------------------------===//
-// Symbol table tracking callbacks.
-//===----------------------------------------------------------------------===//
-
-bool Sema::isTypeName(const IdentifierInfo &II, Scope *S) const {
-  Decl *D = II.getFETokenInfo<Decl>();
-  return D != 0 && D->getDeclSpec().StorageClassSpec == DeclSpec::SCS_typedef;
-}
-
-Action::DeclTy *
-Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init, 
-                      DeclTy *LastInGroup) {
-  IdentifierInfo *II = D.getIdentifier();
-  Decl *PrevDecl = II ? II->getFETokenInfo<Decl>() : 0;
-
-  Decl *New;
-  if (D.isFunctionDeclarator())
-    New = new FunctionDecl(II, D, PrevDecl);
-  else
-    New = new VarDecl(II, D, PrevDecl);
-  
-  // If this has an identifier, add it to the scope stack.
-  if (II) {
-    // If PrevDecl includes conflicting name here, emit a diagnostic.
-    II->setFETokenInfo(New);
-    S->AddDecl(II);
-  }
-  
-  // If this is a top-level decl that is chained to some other (e.g. int A,B,C;)
-  // remember this in the LastInGroupList list.
-  if (LastInGroup && S->getParent() == 0)
-    LastInGroupList.push_back((Decl*)LastInGroup);
-  
-  return New;
-}
-
-Action::DeclTy *
-Sema::ParseFunctionDefinition(Scope *S, Declarator &D, StmtTy *Body) {
-  FunctionDecl *FD = (FunctionDecl *)ParseDeclarator(S, D, 0, 0);
-  
-  FD->setBody((Stmt*)Body);
-
-  return FD;
-}
-
-void Sema::PopScope(SourceLocation Loc, Scope *S) {
-  for (Scope::decl_iterator I = S->decl_begin(), E = S->decl_end();
-       I != E; ++I) {
-    IdentifierInfo &II = *static_cast<IdentifierInfo*>(*I);
-    Decl *D = II.getFETokenInfo<Decl>();
-    assert(D && "This decl didn't get pushed??");
-    
-    Decl *Next = D->getNext();
-
-    // FIXME: Push the decl on the parent function list if in a function.
-    delete D;
-    
-    II.setFETokenInfo(Next);
-  }
-}
-
-//===--------------------------------------------------------------------===//
-// Expression Parsing Callbacks.
-//===--------------------------------------------------------------------===//
-
-Action::ExprResult Sema::ParseSimplePrimaryExpr(SourceLocation Loc,
-                                                tok::TokenKind Kind) {
-  switch (Kind) {
-  default:
-    assert(0 && "Unknown simple primary expr!");
-  case tok::identifier: {
-    // Could be enum-constant or decl.
-    //Tok.getIdentifierInfo()
-    return new DeclRefExpr(*(Decl*)0);
-  }
-    
-  case tok::char_constant:     // constant: character-constant
-  case tok::kw___func__:       // primary-expression: __func__ [C99 6.4.2.2]
-  case tok::kw___FUNCTION__:   // primary-expression: __FUNCTION__ [GNU]
-  case tok::kw___PRETTY_FUNCTION__:  // primary-expression: __P..Y_F..N__ [GNU]
-    //assert(0 && "FIXME: Unimp so far!");
-    return new DeclRefExpr(*(Decl*)0);
-  }
-}
-
-Action::ExprResult Sema::ParseIntegerConstant(SourceLocation Loc) {
-  return new IntegerConstant();
-}
-Action::ExprResult Sema::ParseFloatingConstant(SourceLocation Loc) {
-  return new FloatingConstant();
-}
-
-Action::ExprResult Sema::ParseParenExpr(SourceLocation L, SourceLocation R,
-                                        ExprTy *Val) {
-  return Val;
-}
-
-
-// Unary Operators.  'Tok' is the token for the operator.
-Action::ExprResult Sema::ParseUnaryOp(SourceLocation OpLoc, tok::TokenKind Op,
-                                      ExprTy *Input) {
-  UnaryOperator::Opcode Opc;
-  switch (Op) {
-  default: assert(0 && "Unknown unary op!");
-  case tok::plusplus:     Opc = UnaryOperator::PreInc; break;
-  case tok::minusminus:   Opc = UnaryOperator::PreDec; break;
-  case tok::amp:          Opc = UnaryOperator::AddrOf; break;
-  case tok::star:         Opc = UnaryOperator::Deref; break;
-  case tok::plus:         Opc = UnaryOperator::Plus; break;
-  case tok::minus:        Opc = UnaryOperator::Minus; break;
-  case tok::tilde:        Opc = UnaryOperator::Not; break;
-  case tok::exclaim:      Opc = UnaryOperator::LNot; break;
-  case tok::kw_sizeof:    Opc = UnaryOperator::SizeOf; break;
-  case tok::kw___alignof: Opc = UnaryOperator::AlignOf; break;
-  case tok::kw___real:    Opc = UnaryOperator::Real; break;
-  case tok::kw___imag:    Opc = UnaryOperator::Imag; break;
-  case tok::ampamp:       Opc = UnaryOperator::AddrLabel; break;
-  case tok::kw___extension__: 
-    return Input;
-    //Opc = UnaryOperator::Extension;
-    //break;
-  }
-
-  return new UnaryOperator((Expr*)Input, Opc);
-}
-
-Action::ExprResult Sema::
-ParseSizeOfAlignOfTypeExpr(SourceLocation OpLoc, bool isSizeof, 
-                           SourceLocation LParenLoc, TypeTy *Ty,
-                           SourceLocation RParenLoc) {
-  return new SizeOfAlignOfTypeExpr(isSizeof, (Type*)Ty);
-}
-
-
-Action::ExprResult Sema::ParsePostfixUnaryOp(SourceLocation OpLoc, 
-                                             tok::TokenKind Kind,
-                                             ExprTy *Input) {
-  UnaryOperator::Opcode Opc;
-  switch (Kind) {
-  default: assert(0 && "Unknown unary op!");
-  case tok::plusplus:   Opc = UnaryOperator::PostInc; break;
-  case tok::minusminus: Opc = UnaryOperator::PostDec; break;
-  }
-  
-  return new UnaryOperator((Expr*)Input, Opc);
-}
-
-Action::ExprResult Sema::
-ParseArraySubscriptExpr(ExprTy *Base, SourceLocation LLoc,
-                        ExprTy *Idx, SourceLocation RLoc) {
-  return new ArraySubscriptExpr((Expr*)Base, (Expr*)Idx);
-}
-
-Action::ExprResult Sema::
-ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
-                         tok::TokenKind OpKind, SourceLocation MemberLoc,
-                         IdentifierInfo &Member) {
-  Decl *MemberDecl = 0;
-  // TODO: Look up MemberDecl.
-  return new MemberExpr((Expr*)Base, OpKind == tok::arrow, MemberDecl);
-}
-
-/// ParseCallExpr - Handle a call to Fn with the specified array of arguments.
-/// This provides the location of the left/right parens and a list of comma
-/// locations.
-Action::ExprResult Sema::
-ParseCallExpr(ExprTy *Fn, SourceLocation LParenLoc,
-              ExprTy **Args, unsigned NumArgs,
-              SourceLocation *CommaLocs, SourceLocation RParenLoc) {
-  return new CallExpr((Expr*)Fn, (Expr**)Args, NumArgs);
-}
-
-Action::ExprResult Sema::
-ParseCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
-              SourceLocation RParenLoc, ExprTy *Op) {
-  return new CastExpr((Type*)Ty, (Expr*)Op);
-}
-
-
-
-// Binary Operators.  'Tok' is the token for the operator.
-Action::ExprResult Sema::ParseBinOp(SourceLocation TokLoc, tok::TokenKind Kind,
-                                    ExprTy *LHS, ExprTy *RHS) {
-  BinaryOperator::Opcode Opc;
-  switch (Kind) {
-  default: assert(0 && "Unknown binop!");
-  case tok::star:                 Opc = BinaryOperator::Mul; break;
-  case tok::slash:                Opc = BinaryOperator::Div; break;
-  case tok::percent:              Opc = BinaryOperator::Rem; break;
-  case tok::plus:                 Opc = BinaryOperator::Add; break;
-  case tok::minus:                Opc = BinaryOperator::Sub; break;
-  case tok::lessless:             Opc = BinaryOperator::Shl; break;
-  case tok::greatergreater:       Opc = BinaryOperator::Shr; break;
-  case tok::lessequal:            Opc = BinaryOperator::LE; break;
-  case tok::less:                 Opc = BinaryOperator::LT; break;
-  case tok::greaterequal:         Opc = BinaryOperator::GE; break;
-  case tok::greater:              Opc = BinaryOperator::GT; break;
-  case tok::exclaimequal:         Opc = BinaryOperator::NE; break;
-  case tok::equalequal:           Opc = BinaryOperator::EQ; break;
-  case tok::amp:                  Opc = BinaryOperator::And; break;
-  case tok::caret:                Opc = BinaryOperator::Xor; break;
-  case tok::pipe:                 Opc = BinaryOperator::Or; break;
-  case tok::ampamp:               Opc = BinaryOperator::LAnd; break;
-  case tok::pipepipe:             Opc = BinaryOperator::LOr; break;
-  case tok::equal:                Opc = BinaryOperator::Assign; break;
-  case tok::starequal:            Opc = BinaryOperator::MulAssign; break;
-  case tok::slashequal:           Opc = BinaryOperator::DivAssign; break;
-  case tok::percentequal:         Opc = BinaryOperator::RemAssign; break;
-  case tok::plusequal:            Opc = BinaryOperator::AddAssign; break;
-  case tok::minusequal:           Opc = BinaryOperator::SubAssign; break;
-  case tok::lesslessequal:        Opc = BinaryOperator::ShlAssign; break;
-  case tok::greatergreaterequal:  Opc = BinaryOperator::ShrAssign; break;
-  case tok::ampequal:             Opc = BinaryOperator::AndAssign; break;
-  case tok::caretequal:           Opc = BinaryOperator::XorAssign; break;
-  case tok::pipeequal:            Opc = BinaryOperator::OrAssign; break;
-  case tok::comma:                Opc = BinaryOperator::Comma; break;
-  }
-  
-  return new BinaryOperator((Expr*)LHS, (Expr*)RHS, Opc);
-}
-
-/// ParseConditionalOp - Parse a ?: operation.  Note that 'LHS' may be null
-/// in the case of a the GNU conditional expr extension.
-Action::ExprResult Sema::ParseConditionalOp(SourceLocation QuestionLoc, 
-                                            SourceLocation ColonLoc,
-                                            ExprTy *Cond, ExprTy *LHS,
-                                            ExprTy *RHS) {
-  return new ConditionalOperator((Expr*)Cond, (Expr*)LHS, (Expr*)RHS);
-}
-

Modified: cfe/cfe/trunk/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/Sema.h?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/Sema.h (original)
+++ cfe/cfe/trunk/Sema/Sema.h Wed Jul 11 11:40:09 2007
@@ -41,7 +41,7 @@
             const std::string &Msg = std::string());
   
   //===--------------------------------------------------------------------===//
-  // Symbol table tracking callbacks.
+  // Symbol table / Decl tracking callbacks: SemaDecl.cpp.
   //
   virtual bool isTypeName(const IdentifierInfo &II, Scope *S) const;
   virtual DeclTy *ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init,
@@ -51,7 +51,7 @@
   virtual void PopScope(SourceLocation Loc, Scope *S);
   
   //===--------------------------------------------------------------------===//
-  // Statement Parsing Callbacks.
+  // Statement Parsing Callbacks: SemaStmt.cpp.
 
   virtual StmtResult ParseCompoundStmt(SourceLocation L, SourceLocation R,
                                        StmtTy **Elts, unsigned NumElts);
@@ -93,7 +93,7 @@
                                      ExprTy *RetValExp);
   
   //===--------------------------------------------------------------------===//
-  // Expression Parsing Callbacks.
+  // Expression Parsing Callbacks: SemaExpr.cpp.
 
   // Primary Expressions.
   virtual ExprResult ParseSimplePrimaryExpr(SourceLocation Loc,

Modified: cfe/cfe/trunk/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/SemaDecl.cpp?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/cfe/trunk/Sema/SemaDecl.cpp Wed Jul 11 11:40:09 2007
@@ -11,8 +11,69 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "clang/Parse/Parser.h"
-#include "clang/Parse/SemaDeclSpec.h"
+#include "Sema.h"
+#include "clang/AST/Decl.h"
+#include "clang/Parse/Scope.h"
+#include "clang/Lex/IdentifierTable.h"
 using namespace llvm;
 using namespace clang;
 
+
+
+bool Sema::isTypeName(const IdentifierInfo &II, Scope *S) const {
+  Decl *D = II.getFETokenInfo<Decl>();
+  return D != 0 && D->getDeclSpec().StorageClassSpec == DeclSpec::SCS_typedef;
+}
+
+Action::DeclTy *
+Sema::ParseDeclarator(Scope *S, Declarator &D, ExprTy *Init, 
+                      DeclTy *LastInGroup) {
+  IdentifierInfo *II = D.getIdentifier();
+  Decl *PrevDecl = II ? II->getFETokenInfo<Decl>() : 0;
+  
+  Decl *New;
+  if (D.isFunctionDeclarator())
+    New = new FunctionDecl(II, D, PrevDecl);
+  else
+    New = new VarDecl(II, D, PrevDecl);
+  
+  // If this has an identifier, add it to the scope stack.
+  if (II) {
+    // If PrevDecl includes conflicting name here, emit a diagnostic.
+    II->setFETokenInfo(New);
+    S->AddDecl(II);
+  }
+  
+  // If this is a top-level decl that is chained to some other (e.g. int A,B,C;)
+  // remember this in the LastInGroupList list.
+  if (LastInGroup && S->getParent() == 0)
+    LastInGroupList.push_back((Decl*)LastInGroup);
+  
+  return New;
+}
+
+Action::DeclTy *
+Sema::ParseFunctionDefinition(Scope *S, Declarator &D, StmtTy *Body) {
+  FunctionDecl *FD = (FunctionDecl *)ParseDeclarator(S, D, 0, 0);
+  
+  FD->setBody((Stmt*)Body);
+  
+  return FD;
+}
+
+void Sema::PopScope(SourceLocation Loc, Scope *S) {
+  for (Scope::decl_iterator I = S->decl_begin(), E = S->decl_end();
+       I != E; ++I) {
+    IdentifierInfo &II = *static_cast<IdentifierInfo*>(*I);
+    Decl *D = II.getFETokenInfo<Decl>();
+    assert(D && "This decl didn't get pushed??");
+    
+    Decl *Next = D->getNext();
+    
+    // FIXME: Push the decl on the parent function list if in a function.
+    delete D;
+    
+    II.setFETokenInfo(Next);
+  }
+}
+

Modified: cfe/cfe/trunk/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/SemaExpr.cpp?rev=39159&r1=39158&r2=39159&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/SemaExpr.cpp (original)
+++ cfe/cfe/trunk/Sema/SemaExpr.cpp Wed Jul 11 11:40:09 2007
@@ -237,3 +237,170 @@
   return new StringExpr(&ResultBuf[0], ResultPtr-&ResultBuf[0], AnyWide);
 }
 
+
+
+Action::ExprResult Sema::ParseSimplePrimaryExpr(SourceLocation Loc,
+                                                tok::TokenKind Kind) {
+  switch (Kind) {
+  default:
+    assert(0 && "Unknown simple primary expr!");
+  case tok::identifier: {
+    // Could be enum-constant or decl.
+    //Tok.getIdentifierInfo()
+    return new DeclRefExpr(*(Decl*)0);
+  }
+    
+  case tok::char_constant:     // constant: character-constant
+  case tok::kw___func__:       // primary-expression: __func__ [C99 6.4.2.2]
+  case tok::kw___FUNCTION__:   // primary-expression: __FUNCTION__ [GNU]
+  case tok::kw___PRETTY_FUNCTION__:  // primary-expression: __P..Y_F..N__ [GNU]
+    //assert(0 && "FIXME: Unimp so far!");
+    return new DeclRefExpr(*(Decl*)0);
+  }
+}
+
+Action::ExprResult Sema::ParseIntegerConstant(SourceLocation Loc) {
+  return new IntegerConstant();
+}
+Action::ExprResult Sema::ParseFloatingConstant(SourceLocation Loc) {
+  return new FloatingConstant();
+}
+
+Action::ExprResult Sema::ParseParenExpr(SourceLocation L, SourceLocation R,
+                                        ExprTy *Val) {
+  return Val;
+}
+
+
+// Unary Operators.  'Tok' is the token for the operator.
+Action::ExprResult Sema::ParseUnaryOp(SourceLocation OpLoc, tok::TokenKind Op,
+                                      ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Op) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:     Opc = UnaryOperator::PreInc; break;
+  case tok::minusminus:   Opc = UnaryOperator::PreDec; break;
+  case tok::amp:          Opc = UnaryOperator::AddrOf; break;
+  case tok::star:         Opc = UnaryOperator::Deref; break;
+  case tok::plus:         Opc = UnaryOperator::Plus; break;
+  case tok::minus:        Opc = UnaryOperator::Minus; break;
+  case tok::tilde:        Opc = UnaryOperator::Not; break;
+  case tok::exclaim:      Opc = UnaryOperator::LNot; break;
+  case tok::kw_sizeof:    Opc = UnaryOperator::SizeOf; break;
+  case tok::kw___alignof: Opc = UnaryOperator::AlignOf; break;
+  case tok::kw___real:    Opc = UnaryOperator::Real; break;
+  case tok::kw___imag:    Opc = UnaryOperator::Imag; break;
+  case tok::ampamp:       Opc = UnaryOperator::AddrLabel; break;
+  case tok::kw___extension__: 
+    return Input;
+    //Opc = UnaryOperator::Extension;
+    //break;
+  }
+
+  return new UnaryOperator((Expr*)Input, Opc);
+}
+
+Action::ExprResult Sema::
+ParseSizeOfAlignOfTypeExpr(SourceLocation OpLoc, bool isSizeof, 
+                           SourceLocation LParenLoc, TypeTy *Ty,
+                           SourceLocation RParenLoc) {
+  return new SizeOfAlignOfTypeExpr(isSizeof, (Type*)Ty);
+}
+
+
+Action::ExprResult Sema::ParsePostfixUnaryOp(SourceLocation OpLoc, 
+                                             tok::TokenKind Kind,
+                                             ExprTy *Input) {
+  UnaryOperator::Opcode Opc;
+  switch (Kind) {
+  default: assert(0 && "Unknown unary op!");
+  case tok::plusplus:   Opc = UnaryOperator::PostInc; break;
+  case tok::minusminus: Opc = UnaryOperator::PostDec; break;
+  }
+  
+  return new UnaryOperator((Expr*)Input, Opc);
+}
+
+Action::ExprResult Sema::
+ParseArraySubscriptExpr(ExprTy *Base, SourceLocation LLoc,
+                        ExprTy *Idx, SourceLocation RLoc) {
+  return new ArraySubscriptExpr((Expr*)Base, (Expr*)Idx);
+}
+
+Action::ExprResult Sema::
+ParseMemberReferenceExpr(ExprTy *Base, SourceLocation OpLoc,
+                         tok::TokenKind OpKind, SourceLocation MemberLoc,
+                         IdentifierInfo &Member) {
+  Decl *MemberDecl = 0;
+  // TODO: Look up MemberDecl.
+  return new MemberExpr((Expr*)Base, OpKind == tok::arrow, MemberDecl);
+}
+
+/// ParseCallExpr - Handle a call to Fn with the specified array of arguments.
+/// This provides the location of the left/right parens and a list of comma
+/// locations.
+Action::ExprResult Sema::
+ParseCallExpr(ExprTy *Fn, SourceLocation LParenLoc,
+              ExprTy **Args, unsigned NumArgs,
+              SourceLocation *CommaLocs, SourceLocation RParenLoc) {
+  return new CallExpr((Expr*)Fn, (Expr**)Args, NumArgs);
+}
+
+Action::ExprResult Sema::
+ParseCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
+              SourceLocation RParenLoc, ExprTy *Op) {
+  return new CastExpr((Type*)Ty, (Expr*)Op);
+}
+
+
+
+// Binary Operators.  'Tok' is the token for the operator.
+Action::ExprResult Sema::ParseBinOp(SourceLocation TokLoc, tok::TokenKind Kind,
+                                    ExprTy *LHS, ExprTy *RHS) {
+  BinaryOperator::Opcode Opc;
+  switch (Kind) {
+  default: assert(0 && "Unknown binop!");
+  case tok::star:                 Opc = BinaryOperator::Mul; break;
+  case tok::slash:                Opc = BinaryOperator::Div; break;
+  case tok::percent:              Opc = BinaryOperator::Rem; break;
+  case tok::plus:                 Opc = BinaryOperator::Add; break;
+  case tok::minus:                Opc = BinaryOperator::Sub; break;
+  case tok::lessless:             Opc = BinaryOperator::Shl; break;
+  case tok::greatergreater:       Opc = BinaryOperator::Shr; break;
+  case tok::lessequal:            Opc = BinaryOperator::LE; break;
+  case tok::less:                 Opc = BinaryOperator::LT; break;
+  case tok::greaterequal:         Opc = BinaryOperator::GE; break;
+  case tok::greater:              Opc = BinaryOperator::GT; break;
+  case tok::exclaimequal:         Opc = BinaryOperator::NE; break;
+  case tok::equalequal:           Opc = BinaryOperator::EQ; break;
+  case tok::amp:                  Opc = BinaryOperator::And; break;
+  case tok::caret:                Opc = BinaryOperator::Xor; break;
+  case tok::pipe:                 Opc = BinaryOperator::Or; break;
+  case tok::ampamp:               Opc = BinaryOperator::LAnd; break;
+  case tok::pipepipe:             Opc = BinaryOperator::LOr; break;
+  case tok::equal:                Opc = BinaryOperator::Assign; break;
+  case tok::starequal:            Opc = BinaryOperator::MulAssign; break;
+  case tok::slashequal:           Opc = BinaryOperator::DivAssign; break;
+  case tok::percentequal:         Opc = BinaryOperator::RemAssign; break;
+  case tok::plusequal:            Opc = BinaryOperator::AddAssign; break;
+  case tok::minusequal:           Opc = BinaryOperator::SubAssign; break;
+  case tok::lesslessequal:        Opc = BinaryOperator::ShlAssign; break;
+  case tok::greatergreaterequal:  Opc = BinaryOperator::ShrAssign; break;
+  case tok::ampequal:             Opc = BinaryOperator::AndAssign; break;
+  case tok::caretequal:           Opc = BinaryOperator::XorAssign; break;
+  case tok::pipeequal:            Opc = BinaryOperator::OrAssign; break;
+  case tok::comma:                Opc = BinaryOperator::Comma; break;
+  }
+  
+  return new BinaryOperator((Expr*)LHS, (Expr*)RHS, Opc);
+}
+
+/// ParseConditionalOp - Parse a ?: operation.  Note that 'LHS' may be null
+/// in the case of a the GNU conditional expr extension.
+Action::ExprResult Sema::ParseConditionalOp(SourceLocation QuestionLoc, 
+                                            SourceLocation ColonLoc,
+                                            ExprTy *Cond, ExprTy *LHS,
+                                            ExprTy *RHS) {
+  return new ConditionalOperator((Expr*)Cond, (Expr*)LHS, (Expr*)RHS);
+}
+





More information about the cfe-commits mailing list