mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-04 20:20:54 +00:00
Fix for crash in __builtin_return_address in template context.
The check for argument value needs to be guarded by !isValueDependent(). Differential Revision: https://reviews.llvm.org/D94438
This commit is contained in:
parent
9f61fbd75a
commit
f706486eaf
@ -1943,7 +1943,8 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
|
||||
// -Wframe-address warning if non-zero passed to builtin
|
||||
// return/frame address.
|
||||
Expr::EvalResult Result;
|
||||
if (TheCall->getArg(0)->EvaluateAsInt(Result, getASTContext()) &&
|
||||
if (!TheCall->getArg(0)->isValueDependent() &&
|
||||
TheCall->getArg(0)->EvaluateAsInt(Result, getASTContext()) &&
|
||||
Result.Val.getInt() != 0)
|
||||
Diag(TheCall->getBeginLoc(), diag::warn_frame_address)
|
||||
<< ((BuiltinID == Builtin::BI__builtin_return_address)
|
||||
|
@ -1,5 +1,6 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wframe-address -verify %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wmost -verify %s
|
||||
// RUN: %clang_cc1 -x c++ -fsyntax-only -Wframe-address -verify %s
|
||||
|
||||
void* a(unsigned x) {
|
||||
return __builtin_return_address(0);
|
||||
@ -17,3 +18,14 @@ void* d(unsigned x) {
|
||||
return __builtin_frame_address(1); // expected-warning{{calling '__builtin_frame_address' with a nonzero argument is unsafe}}
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
template<int N> void *RA()
|
||||
{
|
||||
return __builtin_return_address(N); // expected-warning{{calling '__builtin_return_address' with a nonzero argument is unsafe}}
|
||||
}
|
||||
|
||||
void *foo()
|
||||
{
|
||||
return RA<2>(); // expected-note{{in instantiation of function template specialization 'RA<2>' requested here}}
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user