ilya-biryukov created this revision. ilya-biryukov added a reviewer: kadircet. Herald added a subscriber: arphaman. Herald added a project: All. ilya-biryukov requested review of this revision. Herald added subscribers: cfe-commits, MaskRay. Herald added projects: clang, clang-tools-extra.
The code mistakenly returns the value as evaluated whenever the temporary is allocated, but not yet evaluated. I could only reproduce in Clangd and could not come up with an example that would crash the compiler. Clangd runs more evaluations for hover than the language would allow. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D158985 Files: clang-tools-extra/clangd/unittests/HoverTests.cpp clang/lib/AST/ExprConstant.cpp Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -7646,7 +7646,8 @@ } bool VisitOpaqueValueExpr(const OpaqueValueExpr *E) { - if (APValue *Value = Info.CurrentCall->getCurrentTemporary(E)) + if (APValue *Value = Info.CurrentCall->getCurrentTemporary(E); + Value && !Value->isAbsent()) return DerivedSuccess(*Value, E); const Expr *Source = E->getSourceExpr(); Index: clang-tools-extra/clangd/unittests/HoverTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/HoverTests.cpp +++ clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -2954,6 +2954,32 @@ HI.NamespaceScope = ""; HI.Value = "0"; }}, + // Should not crash. + {R"objc( + typedef struct MyRect {} MyRect; + + @interface IFace + @property(nonatomic) MyRect frame; + @end + + MyRect foobar() { + MyRect mr; + return mr; + } + void test() { + IFace *v; + v.frame = [[foo^bar]](); + } + )objc", + [](HoverInfo &HI) { + HI.Name = "foobar"; + HI.Kind = index::SymbolKind::Function; + HI.NamespaceScope = ""; + HI.Definition = "MyRect foobar()"; + HI.Type = {"MyRect ()", "MyRect ()"}; + HI.ReturnType = {"MyRect", "MyRect"}; + HI.Parameters.emplace(); + }}, {R"cpp( void foo(int * __attribute__(([[non^null]], noescape)) ); )cpp",
Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -7646,7 +7646,8 @@ } bool VisitOpaqueValueExpr(const OpaqueValueExpr *E) { - if (APValue *Value = Info.CurrentCall->getCurrentTemporary(E)) + if (APValue *Value = Info.CurrentCall->getCurrentTemporary(E); + Value && !Value->isAbsent()) return DerivedSuccess(*Value, E); const Expr *Source = E->getSourceExpr(); Index: clang-tools-extra/clangd/unittests/HoverTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/HoverTests.cpp +++ clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -2954,6 +2954,32 @@ HI.NamespaceScope = ""; HI.Value = "0"; }}, + // Should not crash. + {R"objc( + typedef struct MyRect {} MyRect; + + @interface IFace + @property(nonatomic) MyRect frame; + @end + + MyRect foobar() { + MyRect mr; + return mr; + } + void test() { + IFace *v; + v.frame = [[foo^bar]](); + } + )objc", + [](HoverInfo &HI) { + HI.Name = "foobar"; + HI.Kind = index::SymbolKind::Function; + HI.NamespaceScope = ""; + HI.Definition = "MyRect foobar()"; + HI.Type = {"MyRect ()", "MyRect ()"}; + HI.ReturnType = {"MyRect", "MyRect"}; + HI.Parameters.emplace(); + }}, {R"cpp( void foo(int * __attribute__(([[non^null]], noescape)) ); )cpp",
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits