[clang] [clang][bytecode] Support virtual bases in C++26 (PR #204289)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 17 08:18:42 PDT 2026
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/204289 at github.com>
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp,h -- clang/test/AST/ByteCode/virtual-bases.cpp clang/include/clang/AST/APValue.h clang/include/clang/AST/DeclCXX.h clang/lib/AST/APValue.cpp clang/lib/AST/ASTImporter.cpp clang/lib/AST/ByteCode/Compiler.cpp clang/lib/AST/ByteCode/Interp.cpp clang/lib/AST/ByteCode/Interp.h clang/lib/AST/ByteCode/Pointer.cpp clang/lib/AST/DeclCXX.cpp clang/lib/AST/ExprConstant.cpp clang/lib/AST/TextNodeDumper.cpp clang/lib/Sema/SemaDeclCXX.cpp clang/lib/Sema/SemaType.cpp clang/test/AST/ByteCode/cxx23.cpp clang/test/CXX/drs/cwg16xx.cpp clang/test/CXX/drs/cwg6xx.cpp --diff_from_common_commit
``````````
:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp
index 3399c12a8..ca2fc2d9e 100644
--- a/clang/lib/AST/APValue.cpp
+++ b/clang/lib/AST/APValue.cpp
@@ -356,7 +356,8 @@ APValue::APValue(const APValue &RHS)
getArrayFiller() = RHS.getArrayFiller();
break;
case Struct:
- MakeStruct(RHS.getStructNumBases(), RHS.getStructNumFields(), RHS.getStructNumVirtualBases());
+ MakeStruct(RHS.getStructNumBases(), RHS.getStructNumFields(),
+ RHS.getStructNumVirtualBases());
for (unsigned I = 0, N = RHS.getStructNumBases(); I != N; ++I)
getStructBase(I) = RHS.getStructBase(I);
for (unsigned I = 0, N = RHS.getStructNumFields(); I != N; ++I)
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index ffa04d51b..9d38b0221 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -10699,7 +10699,8 @@ ASTNodeImporter::ImportAPValue(const APValue &FromValue) {
ImportLoop(
((const APValue::StructData *)(const char *)&FromValue.Data)->Elts,
((const APValue::StructData *)(const char *)&Result.Data)->Elts,
- FromValue.getStructNumBases() + FromValue.getStructNumFields() + FromValue.getStructNumVirtualBases());
+ FromValue.getStructNumBases() + FromValue.getStructNumFields() +
+ FromValue.getStructNumVirtualBases());
break;
case APValue::Union: {
Result.MakeUnion();
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 2e5a6c6f8..feead2bb7 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -486,7 +486,6 @@ CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases,
assert(VBases.size() >= InheritedVBases);
-
data().NumVBases = VBases.size();
data().NumInheritedVBases = InheritedVBases;
for (int I = 0, E = VBases.size(); I != E; ++I) {
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index c8325fa24..701215e2d 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -5467,7 +5467,8 @@ static bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E,
/// Get the value to use for a default-initialized object of type T.
/// Return false if it encounters something invalid.
-static bool handleDefaultInitValue(QualType T, APValue &Result, bool Toplevel = true) {
+static bool handleDefaultInitValue(QualType T, APValue &Result,
+ bool Toplevel = true) {
bool Success = true;
// If there is already a value present don't overwrite it.
@@ -5484,11 +5485,16 @@ static bool handleDefaultInitValue(QualType T, APValue &Result, bool Toplevel =
return true;
}
- // llvm::errs() << RD->getName() << " has " << RD->getNumBases() << " bases and " << RD->getNumVBases() << " vbases. " << RD->getNumInheritedVBases() << " of those vbases are inherited. (Our value: " << (RD->getNumBases() - (RD->getNumVBases() - RD->getNumInheritedVBases())) << ")\n";
- Result =
- APValue(APValue::UninitStruct(), RD->getNumBases() - (RD->getNumVBases() - RD->getNumInheritedVBases()),
- RD->getNumFields(), Toplevel ? RD->getNumVBases() : 0);
- // llvm::errs() << " NOW: " << Result.getStructNumBases() << " / " << Result.getStructNumVirtualBases() << '\n';
+ // llvm::errs() << RD->getName() << " has " << RD->getNumBases() << " bases
+ // and " << RD->getNumVBases() << " vbases. " << RD->getNumInheritedVBases()
+ // << " of those vbases are inherited. (Our value: " << (RD->getNumBases() -
+ // (RD->getNumVBases() - RD->getNumInheritedVBases())) << ")\n";
+ Result = APValue(APValue::UninitStruct(),
+ RD->getNumBases() -
+ (RD->getNumVBases() - RD->getNumInheritedVBases()),
+ RD->getNumFields(), Toplevel ? RD->getNumVBases() : 0);
+ // llvm::errs() << " NOW: " << Result.getStructNumBases() << " / " <<
+ // Result.getStructNumVirtualBases() << '\n';
unsigned Index = 0;
for (CXXRecordDecl::base_class_const_iterator B = RD->bases_begin(),
@@ -5497,8 +5503,8 @@ static bool handleDefaultInitValue(QualType T, APValue &Result, bool Toplevel =
if (B->isVirtual())
continue;
- Success &=
- handleDefaultInitValue(B->getType(), Result.getStructBase(Index), false);
+ Success &= handleDefaultInitValue(B->getType(),
+ Result.getStructBase(Index), false);
++Index;
}
@@ -5510,12 +5516,12 @@ static bool handleDefaultInitValue(QualType T, APValue &Result, bool Toplevel =
}
if (Toplevel) {
- Index = 0;
- for (const auto &B : RD->vbases()) {
- Success &= handleDefaultInitValue(B.getType(),
- Result.getStructVirtualBase(Index), false);
- ++Index;
- }
+ Index = 0;
+ for (const auto &B : RD->vbases()) {
+ Success &= handleDefaultInitValue(
+ B.getType(), Result.getStructVirtualBase(Index), false);
+ ++Index;
+ }
}
return Success;
@@ -21662,12 +21668,13 @@ bool VarDecl::evaluateDestruction(
// anyway, then the destruction is constant (and must be essentially empty).
APValue DestroyedValue;
// if (getEvaluatedValue() && !getEvaluatedValue()->isAbsent())
- // DestroyedValue = *getEvaluatedValue();
- // else
- if (!handleDefaultInitValue(getType(), DestroyedValue))
+ // DestroyedValue = *getEvaluatedValue();
+ // else
+ if (!handleDefaultInitValue(getType(), DestroyedValue))
return false;
- // llvm::errs() << getName() << ": " << DestroyedValue.getStructNumBases() << " / " << DestroyedValue.getStructNumVirtualBases() << '\n';
+ // llvm::errs() << getName() << ": " << DestroyedValue.getStructNumBases() <<
+ // " / " << DestroyedValue.getStructNumVirtualBases() << '\n';
// DestroyedValue.dump();
if (Ctx.getLangOpts().EnableNewConstInterp) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/204289
More information about the cfe-commits
mailing list