diff options
| author | Vitaly Buka <vitalybuka@google.com> | 2024-10-10 21:00:26 -0700 |
|---|---|---|
| committer | Vitaly Buka <vitalybuka@google.com> | 2024-10-10 21:00:26 -0700 |
| commit | 48258e501c767a84ec0fa69adea8e51043c24daa (patch) | |
| tree | 8cab8eb0c776a993cc6fe8cca404fcc2b26c77e9 | |
| parent | f480f4512373d4d03e6e8232f5cdaa9cf61c8be1 (diff) | |
| parent | 374886a360424d5f1c38359378a504408a9f64ed (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.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/AST/ByteCode/Pointer.cpp | 5 | ||||
| -rw-r--r-- | clang/test/AST/ByteCode/cxx1z.cpp | 3 |
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]'}} |
