summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2024-10-10 21:00:26 -0700
committerVitaly Buka <vitalybuka@google.com>2024-10-10 21:00:26 -0700
commit48258e501c767a84ec0fa69adea8e51043c24daa (patch)
tree8cab8eb0c776a993cc6fe8cca404fcc2b26c77e9
parentf480f4512373d4d03e6e8232f5cdaa9cf61c8be1 (diff)
parent374886a360424d5f1c38359378a504408a9f64ed (diff)
[𝘀𝗽𝗿] changes introduced through rebaseusers/vitalybuka/spr/main.nfcsanitizer-vreport-incomplete-list
Created using spr 1.3.4 [skip ci]
-rw-r--r--clang/lib/AST/ByteCode/Compiler.cpp16
-rw-r--r--clang/lib/AST/ByteCode/Pointer.cpp5
-rw-r--r--clang/test/AST/ByteCode/cxx1z.cpp3
3 files changed, 13 insertions, 11 deletions
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index ba4c5600d613..0a3b38b0dc6e 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -6006,6 +6006,9 @@ bool Compiler<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) {
return this->emitGetPtrParam(It->second.Offset, E);
}
+
+ if (D->getType()->isReferenceType())
+ return false; // FIXME: Do we need to emit InvalidDeclRef?
}
// In case we need to re-visit a declaration.
@@ -6042,9 +6045,7 @@ bool Compiler<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) {
const auto typeShouldBeVisited = [&](QualType T) -> bool {
if (T.isConstant(Ctx.getASTContext()))
return true;
- if (const auto *RT = T->getAs<ReferenceType>())
- return RT->getPointeeType().isConstQualified();
- return false;
+ return T->isReferenceType();
};
// DecompositionDecls are just proxies for us.
@@ -6060,9 +6061,12 @@ bool Compiler<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) {
// other words, we're evaluating the initializer, just to know if we can
// evaluate the initializer.
if (VD->isLocalVarDecl() && typeShouldBeVisited(VD->getType()) &&
- VD->getInit() && !VD->getInit()->isValueDependent() &&
- VD->evaluateValue())
- return revisit(VD);
+ VD->getInit() && !VD->getInit()->isValueDependent()) {
+
+ if (VD->evaluateValue())
+ return revisit(VD);
+ return this->emitInvalidDeclRef(cast<DeclRefExpr>(E), E);
+ }
}
} else {
if (const auto *VD = dyn_cast<VarDecl>(D);
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp
index a52f0e336ef2..75b00dcb2ab2 100644
--- a/clang/lib/AST/ByteCode/Pointer.cpp
+++ b/clang/lib/AST/ByteCode/Pointer.cpp
@@ -253,11 +253,6 @@ APValue Pointer::toAPValue(const ASTContext &ASTCtx) const {
}
}
- // FIXME(perf): We compute the lvalue path above, but we can't supply it
- // for dummy pointers (that causes crashes later in CheckConstantExpression).
- if (isDummy())
- Path.clear();
-
// We assemble the LValuePath starting from the innermost pointer to the
// outermost one. SO in a.b.c, the first element in Path will refer to
// the field 'c', while later code expects it to refer to 'a'.
diff --git a/clang/test/AST/ByteCode/cxx1z.cpp b/clang/test/AST/ByteCode/cxx1z.cpp
index 2b5d215f0165..1a06597fa348 100644
--- a/clang/test/AST/ByteCode/cxx1z.cpp
+++ b/clang/test/AST/ByteCode/cxx1z.cpp
@@ -10,3 +10,6 @@ namespace Temp {
A<int &, addr({}).n> c; // both-error {{reference to subobject of temporary object}}
A<int *, &addr({}).n> d; // both-error {{pointer to subobject of temporary object}}
}
+
+char arr[3];
+A<const char*, &arr[1]> d; // both-error {{refers to subobject '&arr[1]'}}