[AST] Fix dependence-bits for CXXDefaultInitExpr.
authorHaojian Wu <hokein.wu@gmail.com>
Mon, 21 Sep 2020 06:42:24 +0000 (08:42 +0200)
committerHaojian Wu <hokein.wu@gmail.com>
Mon, 21 Sep 2020 06:47:01 +0000 (08:47 +0200)
Reviewed By: sammccall

Differential Revision: https://reviews.llvm.org/D87382

clang/include/clang/AST/ComputeDependence.h
clang/lib/AST/ComputeDependence.cpp
clang/lib/AST/ExprCXX.cpp
clang/test/SemaCXX/invalid-constructor-init.cpp

index ac2daf9..6af0e46 100644 (file)
@@ -70,6 +70,7 @@ class CXXPseudoDestructorExpr;
 class OverloadExpr;
 class DependentScopeDeclRefExpr;
 class CXXConstructExpr;
+class CXXDefaultInitExpr;
 class LambdaExpr;
 class CXXUnresolvedConstructExpr;
 class CXXDependentScopeMemberExpr;
@@ -153,6 +154,7 @@ ExprDependence computeDependence(OverloadExpr *E, bool KnownDependent,
                                  bool KnownContainsUnexpandedParameterPack);
 ExprDependence computeDependence(DependentScopeDeclRefExpr *E);
 ExprDependence computeDependence(CXXConstructExpr *E);
+ExprDependence computeDependence(CXXDefaultInitExpr *E);
 ExprDependence computeDependence(LambdaExpr *E,
                                  bool ContainsUnexpandedParameterPack);
 ExprDependence computeDependence(CXXUnresolvedConstructExpr *E);
index c3a2090..320025e 100644 (file)
@@ -694,6 +694,10 @@ ExprDependence clang::computeDependence(CXXConstructExpr *E) {
   return D;
 }
 
+ExprDependence clang::computeDependence(CXXDefaultInitExpr *E) {
+  return E->getExpr()->getDependence();
+}
+
 ExprDependence clang::computeDependence(LambdaExpr *E,
                                         bool ContainsUnexpandedParameterPack) {
   auto D = toExprDependence(E->getType()->getDependence());
index 1fd2b8e..fe2de4b 100644 (file)
@@ -959,7 +959,7 @@ CXXDefaultInitExpr::CXXDefaultInitExpr(const ASTContext &Ctx,
   CXXDefaultInitExprBits.Loc = Loc;
   assert(Field->hasInClassInitializer());
 
-  setDependence(ExprDependence::None);
+  setDependence(computeDependence(this));
 }
 
 CXXTemporary *CXXTemporary::Create(const ASTContext &C,
index df10afb..3e0c8b5 100644 (file)
@@ -9,8 +9,7 @@ struct X {
 constexpr int Z = X().Y; // expected-error {{constexpr variable 'Z' must be initialized by a constant expression}}
 
 struct X2 {
-  int Y = foo();    // expected-error {{use of undeclared identifier 'foo'}} \
-                 // expected-note {{subexpression not valid in a constant expression}}
+  int Y = foo();    // expected-error {{use of undeclared identifier 'foo'}}
   constexpr X2() {} // expected-error {{constexpr constructor never produces a constant expression}}
 };
 
@@ -27,3 +26,9 @@ struct CycleDelegate {
   // no bogus "delegation cycle" diagnostic
   CycleDelegate(float) : CycleDelegate(1) {}
 };
+
+struct X4 {
+  int* p = new int(invalid()); // expected-error {{use of undeclared identifier}}
+};
+// no crash on evaluating the CXXDefaultInitExpr.
+constexpr int* s = X4().p; // expected-error {{must be initialized by}}