diff options
| author | Douglas Gregor <dgregor@apple.com> | 2008-12-05 23:32:09 +0000 | 
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2008-12-05 23:32:09 +0000 | 
| commit | 4619e439b64a251fe35f7a5821aa90d78b879fa9 (patch) | |
| tree | d67783abf73134f163d2d6151c65b7bcb5cbc4ac /clang/lib/AST/Expr.cpp | |
| parent | 0733759b5aaabd81eb2348651fb726c075c08e0c (diff) | |
| download | bcm5719-llvm-4619e439b64a251fe35f7a5821aa90d78b879fa9.tar.gz bcm5719-llvm-4619e439b64a251fe35f7a5821aa90d78b879fa9.zip | |
Introduce basic support for dependent types, type-dependent
expressions, and value-dependent expressions. This permits us to parse
some template definitions.
This is not a complete solution; we're missing type- and
value-dependent computations for most of the expression types, and
we're missing checks for dependent types and type-dependent
expressions throughout Sema.
llvm-svn: 60615
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 30 | 
1 files changed, 28 insertions, 2 deletions
| diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index a3264b010b7..14db18c1345 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -103,7 +103,10 @@ const char *UnaryOperator::getOpcodeStr(Opcode Op) {  CallExpr::CallExpr(StmtClass SC, Expr *fn, Expr **args, unsigned numargs,                      QualType t, SourceLocation rparenloc) -  : Expr(SC, t), NumArgs(numargs) { +  : Expr(SC, t,  +         fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs), +         fn->isValueDependent() || hasAnyValueDependentArguments(args, numargs)), +    NumArgs(numargs) {    SubExprs = new Stmt*[numargs+1];    SubExprs[FN] = fn;    for (unsigned i = 0; i != numargs; ++i) @@ -113,7 +116,10 @@ CallExpr::CallExpr(StmtClass SC, Expr *fn, Expr **args, unsigned numargs,  CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs, QualType t,                     SourceLocation rparenloc) -  : Expr(CallExprClass, t), NumArgs(numargs) { +  : Expr(CallExprClass, t, +         fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs), +         fn->isValueDependent() || hasAnyValueDependentArguments(args, numargs)), +    NumArgs(numargs) {    SubExprs = new Stmt*[numargs+1];    SubExprs[FN] = fn;    for (unsigned i = 0; i != numargs; ++i) @@ -631,6 +637,26 @@ Expr *Expr::IgnoreParenCasts() {    }  } +/// hasAnyTypeDependentArguments - Determines if any of the expressions +/// in Exprs is type-dependent. +bool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) { +  for (unsigned I = 0; I < NumExprs; ++I) +    if (Exprs[I]->isTypeDependent()) +      return true; + +  return false; +} + +/// hasAnyValueDependentArguments - Determines if any of the expressions +/// in Exprs is value-dependent. +bool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) { +  for (unsigned I = 0; I < NumExprs; ++I) +    if (Exprs[I]->isValueDependent()) +      return true; + +  return false; +} +  bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const {    switch (getStmtClass()) {    default: | 

