| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 1 | //===--- ParseExprCXX.cpp - C++ Expression Parsing ------------------------===// | 
 | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
 | 5 | // This file was developed by Bill Wendling and is distributed under the | 
 | 6 | // University of Illinois Open Source License. See LICENSE.TXT for details. | 
 | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | // | 
 | 10 | // This file implements the Expression parsing implementation for C++. | 
 | 11 | // | 
 | 12 | //===----------------------------------------------------------------------===// | 
 | 13 |  | 
 | 14 | #include "clang/Basic/Diagnostic.h" | 
 | 15 | #include "clang/Parse/Parser.h" | 
 | 16 | using namespace clang; | 
 | 17 |  | 
 | 18 | /// ParseCXXCasts - This handles the various ways to cast expressions to another | 
 | 19 | /// type. | 
 | 20 | /// | 
 | 21 | ///       postfix-expression: [C++ 5.2p1] | 
 | 22 | ///         'dynamic_cast' '<' type-name '>' '(' expression ')' | 
 | 23 | ///         'static_cast' '<' type-name '>' '(' expression ')' | 
 | 24 | ///         'reinterpret_cast' '<' type-name '>' '(' expression ')' | 
 | 25 | ///         'const_cast' '<' type-name '>' '(' expression ')' | 
 | 26 | /// | 
 | 27 | Parser::ExprResult Parser::ParseCXXCasts() { | 
 | 28 |   tok::TokenKind Kind = Tok.getKind(); | 
 | 29 |   const char *CastName = 0;     // For error messages | 
 | 30 |  | 
 | 31 |   switch (Kind) { | 
 | 32 |   default: assert(0 && "Unknown C++ cast!"); abort(); | 
 | 33 |   case tok::kw_const_cast:       CastName = "const_cast";       break; | 
 | 34 |   case tok::kw_dynamic_cast:     CastName = "dynamic_cast";     break; | 
 | 35 |   case tok::kw_reinterpret_cast: CastName = "reinterpret_cast"; break; | 
 | 36 |   case tok::kw_static_cast:      CastName = "static_cast";      break; | 
 | 37 |   } | 
 | 38 |  | 
 | 39 |   SourceLocation OpLoc = ConsumeToken(); | 
 | 40 |   SourceLocation LAngleBracketLoc = Tok.getLocation(); | 
 | 41 |  | 
 | 42 |   if (ExpectAndConsume(tok::less, diag::err_expected_less_after, CastName)) | 
 | 43 |     return ExprResult(true); | 
 | 44 |  | 
 | 45 |   TypeTy *CastTy = ParseTypeName(); | 
 | 46 |   SourceLocation RAngleBracketLoc = Tok.getLocation(); | 
 | 47 |  | 
 | 48 |   if (ExpectAndConsume(tok::greater, diag::err_expected_greater)) { | 
 | 49 |     Diag(LAngleBracketLoc, diag::err_matching, "<"); | 
 | 50 |     return ExprResult(true); | 
 | 51 |   } | 
 | 52 |  | 
 | 53 |   SourceLocation LParenLoc = Tok.getLocation(), RParenLoc; | 
 | 54 |  | 
| Chris Lattner | 4e1d99a | 2007-10-09 17:41:39 +0000 | [diff] [blame] | 55 |   if (Tok.isNot(tok::l_paren)) { | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 56 |     Diag(Tok, diag::err_expected_lparen_after, CastName); | 
 | 57 |     return ExprResult(true); | 
 | 58 |   } | 
 | 59 |  | 
 | 60 |   ExprResult Result = ParseSimpleParenExpression(RParenLoc); | 
 | 61 |  | 
 | 62 |   if (!Result.isInvalid) | 
| Steve Naroff | 1b273c4 | 2007-09-16 14:56:35 +0000 | [diff] [blame] | 63 |     Result = Actions.ActOnCXXCasts(OpLoc, Kind, | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 64 |                                    LAngleBracketLoc, CastTy, RAngleBracketLoc, | 
 | 65 |                                    LParenLoc, Result.Val, RParenLoc); | 
 | 66 |  | 
 | 67 |   return Result; | 
 | 68 | } | 
 | 69 |  | 
 | 70 | /// ParseCXXBoolLiteral - This handles the C++ Boolean literals. | 
 | 71 | /// | 
 | 72 | ///       boolean-literal: [C++ 2.13.5] | 
 | 73 | ///         'true' | 
 | 74 | ///         'false' | 
 | 75 | Parser::ExprResult Parser::ParseCXXBoolLiteral() { | 
 | 76 |   tok::TokenKind Kind = Tok.getKind(); | 
| Steve Naroff | 1b273c4 | 2007-09-16 14:56:35 +0000 | [diff] [blame] | 77 |   return Actions.ActOnCXXBoolLiteral(ConsumeToken(), Kind); | 
| Reid Spencer | 5f016e2 | 2007-07-11 17:01:13 +0000 | [diff] [blame] | 78 | } |