Skip to content

Commit 864ed29

Browse files
committed
WIP
1 parent ac08b85 commit 864ed29

1 file changed

Lines changed: 27 additions & 62 deletions

File tree

clang/lib/AST/ExprConstantMeta.cpp

Lines changed: 27 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -6423,6 +6423,17 @@ static void appendQualType(llvm::FoldingSetNodeID &ID, const QualType &Ty)
64236423
ID.AddInteger(Ty.getQualifiers().getAsOpaqueValue());
64246424
}
64256425

6426+
static void appendSourceLocation(llvm::FoldingSetNodeID &ID, const SourceLocation& Loc)
6427+
{
6428+
ID.AddInteger(Loc.getHashValue());
6429+
}
6430+
6431+
static void appendSourceRange(llvm::FoldingSetNodeID &ID, const SourceRange& Range)
6432+
{
6433+
appendSourceLocation(ID, Range.getBegin());
6434+
appendSourceLocation(ID, Range.getEnd());
6435+
}
6436+
64266437
bool reflection_hash(APValue &Result, ASTContext &C, MetaActions &Meta,
64276438
EvalFn Evaluator, DiagFn Diagnoser, bool AllowInjection,
64286439
QualType ResultTy, SourceRange Range, ArrayRef<Expr *> Args,
@@ -6435,81 +6446,35 @@ bool reflection_hash(APValue &Result, ASTContext &C, MetaActions &Meta,
64356446
return true;
64366447
}
64376448

6438-
// TODO(Matt): find difference between isReflectionType() and C.MetaInfoTy
6439-
//assert(ResultTy == C.MetaInfoTy);
6440-
64416449
llvm::FoldingSetNodeID ID;
6450+
ID.AddInteger(static_cast<std::size_t>(R.getReflectionKind()));
64426451

6443-
std::size_t seed = 0; // to distinguish hashes of different kinds
64446452
switch (R.getReflectionKind()) {
64456453
case ReflectionKind::Null: { // DONE
6446-
seed = 0;
6454+
ID.AddInteger(0);
64476455
} break;
64486456
case ReflectionKind::Type: { // DONE
6449-
appendQualType(ID, R.getReflectedType());
6450-
seed = 1;
6457+
appendQualType(ID, R.getReflectedType());
64516458
} break;
6452-
case ReflectionKind::Declaration: { // TODO
6453-
seed = 2;
6454-
ValueDecl *D = RV.getReflectedDecl();
6455-
6456-
switch (D->getDeclName().getNameKind()) {
6457-
case DeclarationName::CXXConstructorName: {} break;
6458-
case DeclarationName::CXXDestructorName: {} break;
6459-
case DeclarationName::CXXConversionFunctionName: {} break;
6460-
case DeclarationName::CXXOperatorName: {} break;
6461-
case DeclarationName::CXXLiteralOperatorName: {} break;
6462-
default:
6463-
if (auto *FD = dyn_cast<FieldDecl>(D)) {
6464-
if (FD->isUnnamedBitField()) {}
6465-
else if (FD->isBitField()) {}
6466-
else { // non-static data member
6467-
}
6468-
}
6469-
else if (isa<ParmVarDecl>(D)) {}
6470-
else if (isa<VarDecl>(D)) {}
6471-
else if (isa<BindingDecl>(D)) {}
6472-
else if (isa<FunctionDecl>(D)) {}
6473-
else if (isa<EnumConstantDecl>(D)) {}
6474-
}
6475-
llvm_unreachable("unhandled declaration kind");
6459+
case ReflectionKind::Declaration: { // DONE
6460+
appendSourceRange(ID, R.getReflectedDecl()->getSourceRange());
64766461
} break;
64776462
case ReflectionKind::Object: { // TODO
6478-
seed = 3;
6463+
llvm_unreachable("TODO - Object not yet hashable");
64796464
} break;
6480-
case ReflectionKind::Value: { // TODO
6481-
seed = 4;
6482-
APValue val = R.getReflectedValue();
6483-
val.Profile(ID);
6465+
case ReflectionKind::Value: { // DONE
6466+
R.getReflectedValue().Profile(ID);
64846467
break; }
6485-
case ReflectionKind::Template: { // TODO
6486-
seed = 5;
6468+
case ReflectionKind::Template: { // DONE
6469+
appendSourceRange(ID, R.getReflectedTemplate().getAsTemplateDecl()->getSourceRange());
64876470
} break;
64886471
case ReflectionKind::Namespace: { // DONE
6489-
seed = 6;
6490-
Decl* D = R.getReflectedNamespace();
6491-
if (isa<TranslationUnitDecl>(D)) { // global namespace
6492-
ID.AddInteger(0); // nothing else to do
6493-
}
6494-
else if (isa<NamespaceDecl>(D)) {
6495-
NamespaceDecl* ND = dyn_cast<NamespaceDecl>(D);
6496-
SourceLocation loc = ND->getBeginLoc();
6497-
ID.AddInteger(loc.getHashValue());
6498-
}
6499-
else if (isa<NamespaceAliasDecl>(D)) {
6500-
NamespaceAliasDecl* ND = dyn_cast<NamespaceAliasDecl>(D);
6501-
SourceLocation loc = ND->getAliasLoc();
6502-
ID.AddInteger(loc.getHashValue());
6503-
}
6504-
else {
6505-
llvm_unreachable("unhandled namespace kind");
6506-
}
6472+
appendSourceRange(ID, R.getReflectedNamespace()->getSourceRange());
65076473
} break;
6508-
case ReflectionKind::BaseSpecifier: { // TODO
6509-
seed = 7;
6474+
case ReflectionKind::BaseSpecifier: { // DONE
6475+
appendSourceRange(ID, R.getReflectedBaseSpecifier()->getSourceRange());
65106476
} break;
65116477
case ReflectionKind::DataMemberSpec: { // DONE
6512-
seed = 8;
65136478
TagDataMemberSpec *TDMS = R.getReflectedDataMemberSpec();
65146479
appendQualType(ID, TDMS->Ty);
65156480
if (TDMS->Name) {
@@ -6523,13 +6488,13 @@ bool reflection_hash(APValue &Result, ASTContext &C, MetaActions &Meta,
65236488
}
65246489
ID.AddInteger(TDMS->NoUniqueAddress);
65256490
} break;
6526-
case ReflectionKind::Annotation: { // TODO
6527-
seed = 9;
6491+
case ReflectionKind::Annotation: { // DONE
6492+
appendSourceLocation(ID, R.getReflectedAnnotation()->getEqLoc());
65286493
} break;
65296494
default:
65306495
llvm_unreachable("unknown reflection kind");
65316496
}
6532-
ID.AddInteger(seed);
6497+
65336498
return SetAndSucceed(
65346499
Result,
65356500
APValue(C.MakeIntValue(ID.computeStableHash(), C.getSizeType())));

0 commit comments

Comments
 (0)