Define and implement CXXNoexceptExpr. Create it in Sema.
llvm-svn: 113623
This commit is contained in:
parent
22e3a93586
commit
4202c0f2a9
|
@ -2431,6 +2431,39 @@ public:
|
|||
virtual child_iterator child_end();
|
||||
};
|
||||
|
||||
/// \brief Represents a C++0x noexcept expression (C++ [expr.unary.noexcept]).
|
||||
///
|
||||
/// The noexcept expression tests whether a given expression might throw. Its
|
||||
/// result is a boolean constant.
|
||||
class CXXNoexceptExpr : public Expr {
|
||||
bool Value : 1;
|
||||
Stmt *Operand;
|
||||
SourceRange Range;
|
||||
|
||||
public:
|
||||
CXXNoexceptExpr(QualType Ty, Expr *Operand, CanThrowResult Val,
|
||||
SourceLocation Keyword, SourceLocation RParen)
|
||||
: Expr(CXXNoexceptExprClass, Ty, /*TypeDependent*/false,
|
||||
/*ValueDependent*/Val == CT_Dependent),
|
||||
Value(Val == CT_Cannot), Operand(Operand), Range(Keyword, RParen)
|
||||
{ }
|
||||
|
||||
Expr *getOperand() const { return static_cast<Expr*>(Operand); }
|
||||
|
||||
virtual SourceRange getSourceRange() const { return Range; }
|
||||
|
||||
bool getValue() const { return Value; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXNoexceptExprClass;
|
||||
}
|
||||
static bool classof(const CXXNoexceptExpr *) { return true; }
|
||||
|
||||
// Iterators
|
||||
virtual child_iterator child_begin();
|
||||
virtual child_iterator child_end();
|
||||
};
|
||||
|
||||
inline ExplicitTemplateArgumentList &OverloadExpr::getExplicitTemplateArgs() {
|
||||
if (isa<UnresolvedLookupExpr>(this))
|
||||
return cast<UnresolvedLookupExpr>(this)->getExplicitTemplateArgs();
|
||||
|
|
|
@ -1844,6 +1844,7 @@ DEF_TRAVERSE_STMT(ConditionalOperator, { })
|
|||
DEF_TRAVERSE_STMT(UnaryOperator, { })
|
||||
DEF_TRAVERSE_STMT(BinaryOperator, { })
|
||||
DEF_TRAVERSE_STMT(CompoundAssignOperator, { })
|
||||
DEF_TRAVERSE_STMT(CXXNoexceptExpr, { })
|
||||
|
||||
// These literals (all of them) do not need any action.
|
||||
DEF_TRAVERSE_STMT(IntegerLiteral, { })
|
||||
|
|
|
@ -110,6 +110,7 @@ def CXXDependentScopeMemberExpr : DStmt<Expr>;
|
|||
def OverloadExpr : DStmt<Expr, 1>;
|
||||
def UnresolvedLookupExpr : DStmt<OverloadExpr>;
|
||||
def UnresolvedMemberExpr : DStmt<OverloadExpr>;
|
||||
def CXXNoexceptExpr : DStmt<Expr>;
|
||||
|
||||
// Obj-C Expressions.
|
||||
def ObjCStringLiteral : DStmt<Expr>;
|
||||
|
|
|
@ -2251,6 +2251,8 @@ public:
|
|||
|
||||
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen,
|
||||
Expr *Operand, SourceLocation RParen);
|
||||
ExprResult BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,
|
||||
SourceLocation RParen);
|
||||
|
||||
/// ActOnUnaryTypeTrait - Parsed one of the unary type trait support
|
||||
/// pseudo-functions.
|
||||
|
|
|
@ -1040,3 +1040,10 @@ Stmt::child_iterator UnresolvedMemberExpr::child_end() {
|
|||
return child_iterator(&Base);
|
||||
return child_iterator(&Base + 1);
|
||||
}
|
||||
|
||||
Stmt::child_iterator CXXNoexceptExpr::child_begin() {
|
||||
return child_iterator(&Operand);
|
||||
}
|
||||
Stmt::child_iterator CXXNoexceptExpr::child_end() {
|
||||
return child_iterator(&Operand + 1);
|
||||
}
|
||||
|
|
|
@ -2441,6 +2441,7 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
|
|||
case Expr::CXXScalarValueInitExprClass:
|
||||
case Expr::TypesCompatibleExprClass:
|
||||
case Expr::UnaryTypeTraitExprClass:
|
||||
case Expr::CXXNoexceptExprClass:
|
||||
return NoDiag();
|
||||
case Expr::CallExprClass:
|
||||
case Expr::CXXOperatorCallExprClass: {
|
||||
|
|
|
@ -1235,6 +1235,12 @@ void StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
|
|||
<< E->getQueriedType().getAsString(Policy) << ")";
|
||||
}
|
||||
|
||||
void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
|
||||
OS << "noexcept(";
|
||||
PrintExpr(E->getOperand());
|
||||
OS << ")";
|
||||
}
|
||||
|
||||
// Obj-C
|
||||
|
||||
void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
|
||||
|
|
|
@ -830,6 +830,10 @@ void StmtProfiler::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *S) {
|
|||
VisitTemplateArguments(S->getTemplateArgs(), S->getNumTemplateArgs());
|
||||
}
|
||||
|
||||
void StmtProfiler::VisitCXXNoexceptExpr(CXXNoexceptExpr *S) {
|
||||
VisitExpr(S);
|
||||
}
|
||||
|
||||
void StmtProfiler::VisitObjCStringLiteral(ObjCStringLiteral *S) {
|
||||
VisitExpr(S);
|
||||
}
|
||||
|
|
|
@ -1618,7 +1618,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) {
|
|||
case Expr::TypesCompatibleExprClass:
|
||||
case Expr::UnaryTypeTraitExprClass:
|
||||
case Expr::VAArgExprClass:
|
||||
case Expr::CXXUuidofExprClass: {
|
||||
case Expr::CXXUuidofExprClass:
|
||||
case Expr::CXXNoexceptExprClass: {
|
||||
// As bad as this diagnostic is, it's better than crashing.
|
||||
Diagnostic &Diags = Context.getDiags();
|
||||
unsigned DiagID = Diags.getCustomDiagID(Diagnostic::Error,
|
||||
|
|
|
@ -3114,15 +3114,21 @@ CXXMemberCallExpr *Sema::BuildCXXMemberCallExpr(Expr *Exp,
|
|||
return CE;
|
||||
}
|
||||
|
||||
ExprResult Sema::ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen,
|
||||
Expr *Operand, SourceLocation RParen) {
|
||||
ExprResult Sema::BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand,
|
||||
SourceLocation RParen) {
|
||||
// C++ [expr.unary.noexcept]p1:
|
||||
// The noexcept operator determines whether the evaluation of its operand,
|
||||
// which is an unevaluated operand, can throw an exception.
|
||||
ExprEvalContexts.back().Context = Unevaluated;
|
||||
|
||||
//return Owned(new (Context) CXXNoexceptExpr(KeyLoc, LParen, Operand, RParen));
|
||||
return ExprError();
|
||||
return Owned(new (Context) CXXNoexceptExpr(Context.BoolTy, Operand,
|
||||
Operand->CanThrow(Context),
|
||||
KeyLoc, RParen));
|
||||
}
|
||||
|
||||
ExprResult Sema::ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation,
|
||||
Expr *Operand, SourceLocation RParen) {
|
||||
return BuildCXXNoexceptExpr(KeyLoc, Operand, RParen);
|
||||
}
|
||||
|
||||
ExprResult Sema::ActOnFinishFullExpr(Expr *FullExpr) {
|
||||
|
|
|
@ -1773,6 +1773,14 @@ public:
|
|||
R, TemplateArgs);
|
||||
}
|
||||
|
||||
/// \brief Build a new noexcept expression.
|
||||
///
|
||||
/// By default, performs semantic analysis to build the new expression.
|
||||
/// Subclasses may override this routine to provide different behavior.
|
||||
ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
|
||||
return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
|
||||
}
|
||||
|
||||
/// \brief Build a new Objective-C @encode expression.
|
||||
///
|
||||
/// By default, performs semantic analysis to build the new expression.
|
||||
|
@ -5975,6 +5983,19 @@ TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old)
|
|||
? &TransArgs : 0));
|
||||
}
|
||||
|
||||
template<typename Derived>
|
||||
ExprResult
|
||||
TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
|
||||
ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
|
||||
if (SubExpr.isInvalid())
|
||||
return ExprError();
|
||||
|
||||
if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
|
||||
return SemaRef.Owned(E->Retain());
|
||||
|
||||
return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
|
||||
}
|
||||
|
||||
template<typename Derived>
|
||||
ExprResult
|
||||
TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
|
||||
|
|
|
@ -145,6 +145,7 @@ CXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, ASTUnit *TU) {
|
|||
case Stmt::CXXUnresolvedConstructExprClass:
|
||||
case Stmt::CXXDependentScopeMemberExprClass:
|
||||
case Stmt::UnresolvedMemberExprClass:
|
||||
case Stmt::CXXNoexceptExprClass:
|
||||
case Stmt::ObjCStringLiteralClass:
|
||||
case Stmt::ObjCEncodeExprClass:
|
||||
case Stmt::ObjCSelectorExprClass:
|
||||
|
|
Loading…
Reference in New Issue