diff --git a/clang/docs/BSC/BiShengCLanguageUserManual.md b/clang/docs/BSC/BiShengCLanguageUserManual.md index 189f2e18a1d917ed78a3d5b866e86358891ba910..5f0bc1e476dbff85aec6f3ca96cba87515c0cd75 100644 --- a/clang/docs/BSC/BiShengCLanguageUserManual.md +++ b/clang/docs/BSC/BiShengCLanguageUserManual.md @@ -4149,14 +4149,16 @@ int main() { return 0; } ``` -2. 允许指向类型 T 的借用转换为指向 void 类型的借用,反过来从类型 void 的借用往类型 T 借用的转换,是不允许的。 +2. 允许指向类型 T 的借用隐式转换为指向 void 类型的借用,反过来从类型 void 的借用往类型 T 借用的隐式转换,是不允许的,但强制类型转换是允许的。 ```C void test() { int x = 10; int *borrow r = &mut x; void *borrow p = r; - // error: 不允许转为 void *borrow 类型 - int *borrow t = (int *borrow)p; + // error: 不允许隐式转为 void *borrow 类型 + int *borrow t1 = p; + // ok:允许强制转换为 void *borrow 类型 + int *borrow t2 = (int *borrow)p; } int main() { diff --git a/clang/lib/Sema/BSC/SemaDeclBSC.cpp b/clang/lib/Sema/BSC/SemaDeclBSC.cpp index d4e3711e6b1b45a2c9dff873ab1e7829fa150185..cba5d94f394891716605a0583ca11757e28cc5b6 100644 --- a/clang/lib/Sema/BSC/SemaDeclBSC.cpp +++ b/clang/lib/Sema/BSC/SemaDeclBSC.cpp @@ -676,6 +676,17 @@ public: FPOptionsOverride()); replacedNodesMap.Insert(E, BO); } + } else if (UO->getOpcode() >= UO_AddrMut && UO->getOpcode() <= UO_AddrConstDeref) { + if (isa(E->IgnoreParenImpCasts())) { + Expr *BaseE = E; + DeclRefExpr *DRE = ReplaceWithTemporaryVariable(E); + CastKind Kind = + DRE->getType()->getAsCXXRecordDecl() ? CK_NoOp : CK_LValueToRValue; + E = ImplicitCastExpr::Create(getSema().Context, DRE->getType(), Kind, + DRE, nullptr, VK_PRValue, + FPOptionsOverride()); + replacedNodesMap.Insert(E, BaseE); + } } UO->setSubExpr(E); return UO; @@ -946,10 +957,8 @@ public: ExprResult TransformUnaryOperator(UnaryOperator *UO) { Expr *Sub = UO->getSubExpr(); - if (UO->getOpcode() == UO_Deref) { - if (replacedNodesMap.Contains(Sub)) { - Sub = replacedNodesMap.Get(Sub); - } + if (replacedNodesMap.Contains(Sub)) { + Sub = replacedNodesMap.Get(Sub); } ExprResult Res = getDerived().TransformExpr(Sub); UO->setSubExpr(Res.get()); diff --git a/clang/test/BSC/Positive/Ownership/borrow_check_rules/reborrow_string_literals/reborrow_string_literals.cbs b/clang/test/BSC/Positive/Ownership/borrow_check_rules/reborrow_string_literals/reborrow_string_literals.cbs new file mode 100644 index 0000000000000000000000000000000000000000..7c43bab43d79ee3c42d78c978b61a3bc0d9ddfbd --- /dev/null +++ b/clang/test/BSC/Positive/Ownership/borrow_check_rules/reborrow_string_literals/reborrow_string_literals.cbs @@ -0,0 +1,16 @@ +// RUN: %clang %s -o %test.output +// RUN: %test.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +void bsc_strcpy_s(char* borrow strDest, int destMax, const char* borrow strSrc) { + *strDest = *strSrc; +} + +int main(){ + char db[10] = {0}; + bsc_strcpy_s(&mut *db, 5, &const *"DB1"); + return 0; +}