adamcz created this revision. adamcz added a reviewer: hokein. adamcz requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Before this change, CXXDefaultArgExpr would always have ExprDependence::None. This can lead to issues when, for example, the inner expression is RecoveryExpr and yet containsErrors() on the default expression is false. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D103982 Files: clang/include/clang/AST/ComputeDependence.h clang/include/clang/AST/ExprCXX.h clang/lib/AST/ComputeDependence.cpp clang/test/AST/ast-dump-default-arg-dep.cpp Index: clang/test/AST/ast-dump-default-arg-dep.cpp =================================================================== --- /dev/null +++ clang/test/AST/ast-dump-default-arg-dep.cpp @@ -0,0 +1,10 @@ +// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -ast-dump -frecovery-ast %s | FileCheck %s + +// CXXDefaultArgExpr should inherit dependence from the inner Expr, in this case +// RecoveryExpr. +void fun(int arg = foo()); + +void test() { + fun(); +} +// CHECK: -CXXDefaultArgExpr 0x{{[^ ]*}} <<invalid sloc>> '<dependent type>' contains-errors lvalue Index: clang/lib/AST/ComputeDependence.cpp =================================================================== --- clang/lib/AST/ComputeDependence.cpp +++ clang/lib/AST/ComputeDependence.cpp @@ -748,6 +748,10 @@ return E->getExpr()->getDependence(); } +ExprDependence clang::computeDependence(CXXDefaultArgExpr *E) { + return E->getExpr()->getDependence(); +} + ExprDependence clang::computeDependence(LambdaExpr *E, bool ContainsUnexpandedParameterPack) { auto D = toExprDependence(E->getType()->getDependence()); Index: clang/include/clang/AST/ExprCXX.h =================================================================== --- clang/include/clang/AST/ExprCXX.h +++ clang/include/clang/AST/ExprCXX.h @@ -1257,7 +1257,7 @@ Param->getDefaultArg()->getObjectKind()), Param(Param), UsedContext(UsedContext) { CXXDefaultArgExprBits.Loc = Loc; - setDependence(ExprDependence::None); + setDependence(computeDependence(this)); } public: Index: clang/include/clang/AST/ComputeDependence.h =================================================================== --- clang/include/clang/AST/ComputeDependence.h +++ clang/include/clang/AST/ComputeDependence.h @@ -71,6 +71,7 @@ class DependentScopeDeclRefExpr; class CXXConstructExpr; class CXXDefaultInitExpr; +class CXXDefaultArgExpr; class LambdaExpr; class CXXUnresolvedConstructExpr; class CXXDependentScopeMemberExpr; @@ -156,6 +157,7 @@ ExprDependence computeDependence(DependentScopeDeclRefExpr *E); ExprDependence computeDependence(CXXConstructExpr *E); ExprDependence computeDependence(CXXDefaultInitExpr *E); +ExprDependence computeDependence(CXXDefaultArgExpr *E); ExprDependence computeDependence(LambdaExpr *E, bool ContainsUnexpandedParameterPack); ExprDependence computeDependence(CXXUnresolvedConstructExpr *E);
Index: clang/test/AST/ast-dump-default-arg-dep.cpp =================================================================== --- /dev/null +++ clang/test/AST/ast-dump-default-arg-dep.cpp @@ -0,0 +1,10 @@ +// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -ast-dump -frecovery-ast %s | FileCheck %s + +// CXXDefaultArgExpr should inherit dependence from the inner Expr, in this case +// RecoveryExpr. +void fun(int arg = foo()); + +void test() { + fun(); +} +// CHECK: -CXXDefaultArgExpr 0x{{[^ ]*}} <<invalid sloc>> '<dependent type>' contains-errors lvalue Index: clang/lib/AST/ComputeDependence.cpp =================================================================== --- clang/lib/AST/ComputeDependence.cpp +++ clang/lib/AST/ComputeDependence.cpp @@ -748,6 +748,10 @@ return E->getExpr()->getDependence(); } +ExprDependence clang::computeDependence(CXXDefaultArgExpr *E) { + return E->getExpr()->getDependence(); +} + ExprDependence clang::computeDependence(LambdaExpr *E, bool ContainsUnexpandedParameterPack) { auto D = toExprDependence(E->getType()->getDependence()); Index: clang/include/clang/AST/ExprCXX.h =================================================================== --- clang/include/clang/AST/ExprCXX.h +++ clang/include/clang/AST/ExprCXX.h @@ -1257,7 +1257,7 @@ Param->getDefaultArg()->getObjectKind()), Param(Param), UsedContext(UsedContext) { CXXDefaultArgExprBits.Loc = Loc; - setDependence(ExprDependence::None); + setDependence(computeDependence(this)); } public: Index: clang/include/clang/AST/ComputeDependence.h =================================================================== --- clang/include/clang/AST/ComputeDependence.h +++ clang/include/clang/AST/ComputeDependence.h @@ -71,6 +71,7 @@ class DependentScopeDeclRefExpr; class CXXConstructExpr; class CXXDefaultInitExpr; +class CXXDefaultArgExpr; class LambdaExpr; class CXXUnresolvedConstructExpr; class CXXDependentScopeMemberExpr; @@ -156,6 +157,7 @@ ExprDependence computeDependence(DependentScopeDeclRefExpr *E); ExprDependence computeDependence(CXXConstructExpr *E); ExprDependence computeDependence(CXXDefaultInitExpr *E); +ExprDependence computeDependence(CXXDefaultArgExpr *E); ExprDependence computeDependence(LambdaExpr *E, bool ContainsUnexpandedParameterPack); ExprDependence computeDependence(CXXUnresolvedConstructExpr *E);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits