[PATCH] D135025: [clang][Interp] Support base class constructors
    Aaron Ballman via Phabricator via cfe-commits 
    cfe-commits at lists.llvm.org
       
    Thu Oct 13 11:14:20 PDT 2022
    
    
  
aaron.ballman added inline comments.
================
Comment at: clang/lib/AST/Interp/ByteCodeExprGen.h:258
+  /// or nullptr if no such decl exists.
+  const CXXRecordDecl * getRecordDecl(const Expr *E) const {
+    QualType T = E->getType();
----------------
================
Comment at: clang/test/AST/Interp/records.cpp:209
+  static_assert(d.getA() == 20);
+  static_assert(d.getB() == 30);
+};
----------------
I'd appreciate some more failure test cases, if they're not already covered elsewhere:
```
struct Base {
  int Val;
};
struct Derived : Base {
  int OtherVal;
  constexpr Derived(int i) : OtherVal(i) {}
};
// Something here should be diagnosed; either because the Derived ctor is not a
// valid constexpr function or because we're accessing an uninitialized member.
constexpr Derived D(12);
static_assert(D.Val == 0);
// Another test is when a constexpr ctor calls a non-constexpr base class ctor.
struct AnotherBase {
  int Val;
  constexpr AnotherBase(int i) : Val(12 / i) {}
};
struct AnotherDerived : AnotherBase {
  constexpr AnotherDerived(int i) : AnotherBase(i) {}
};
constexpr AnotherDerived Derp(0);
// Skipping the derived class constructor is also
// interesting to consider:
struct YetAnotherBase {
  int Val;
  constexpr YetAnotherBase(int i) : Val(i) {}
};
struct YetAnotherDerived : YetAnotherBase {
  using YetAnotherBase::YetAnotherBase;
  
  int OtherVal;
  constexpr bool doit() const { return Val == OtherVal; }
};
constexpr YetAnotherDerived Oops(0);
```
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D135025/new/
https://reviews.llvm.org/D135025
    
    
More information about the cfe-commits
mailing list