diff --git a/cpp/ql/test/library-tests/conversions/conversions.cpp b/cpp/ql/test/library-tests/conversions/conversions.cpp index 5bc614cbf12..4fb1fa3c200 100644 --- a/cpp/ql/test/library-tests/conversions/conversions.cpp +++ b/cpp/ql/test/library-tests/conversions/conversions.cpp @@ -223,8 +223,8 @@ void DynamicCast() { PolymorphicBase* pb = &b; PolymorphicDerived* pd = &d; - // These two casts are represented as BaseClassCasts because they can be resolved at compile time. - pb = dynamic_cast(pd); + // These two casts were previously represented as BaseClassCasts because they were resolved at compile time, but the front-end no longer performs this optimization. + pb = dynamic_cast(pd); PolymorphicBase& rb = dynamic_cast(d); pd = dynamic_cast(pb); diff --git a/cpp/ql/test/library-tests/conversions/conversions.expected b/cpp/ql/test/library-tests/conversions/conversions.expected index 8c4d8af8b62..1aa02a15aaa 100644 --- a/cpp/ql/test/library-tests/conversions/conversions.expected +++ b/cpp/ql/test/library-tests/conversions/conversions.expected @@ -137,8 +137,8 @@ | conversions.cpp:207:7:207:31 | reinterpret_cast... | pointer to integral conversion | prval | long | void * | | conversions.cpp:208:7:208:14 | (void *)... | integral to pointer conversion | prval | void * | long | | conversions.cpp:209:7:209:32 | reinterpret_cast... | integral to pointer conversion | prval | void * | long | -| conversions.cpp:227:8:227:41 | (PolymorphicBase *)... | base class conversion | prval | PolymorphicBase * | PolymorphicDerived * | -| conversions.cpp:228:25:228:57 | (PolymorphicBase)... | base class conversion | lval | PolymorphicBase | PolymorphicDerived | +| conversions.cpp:227:8:227:41 | dynamic_cast... | dynamic_cast | prval | PolymorphicBase * | PolymorphicDerived * | +| conversions.cpp:228:25:228:57 | dynamic_cast... | dynamic_cast | lval | PolymorphicBase | PolymorphicDerived | | conversions.cpp:230:8:230:44 | dynamic_cast... | dynamic_cast | prval | PolymorphicDerived * | PolymorphicBase * | | conversions.cpp:231:28:231:63 | dynamic_cast... | dynamic_cast | lval | PolymorphicDerived | PolymorphicBase | | conversions.cpp:235:7:235:16 | (void *)... | pointer conversion | prval | void * | ..(*)(..) | diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 475c191c67c..a7da38c6d97 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -5583,8 +5583,8 @@ ir.cpp: # 857| 0: pb # 857| Type = PolymorphicBase * # 857| ValueCategory = lvalue -# 857| 1: (PolymorphicBase *)... -# 857| Conversion = base class conversion +# 857| 1: dynamic_cast... +# 857| Conversion = dynamic_cast # 857| Type = PolymorphicBase * # 857| ValueCategory = prvalue # 857| expr: pd @@ -5597,8 +5597,8 @@ ir.cpp: # 858| expr: (reference to) # 858| Type = PolymorphicBase & # 858| ValueCategory = prvalue -# 858| expr: (PolymorphicBase)... -# 858| Conversion = base class conversion +# 858| expr: dynamic_cast... +# 858| Conversion = dynamic_cast # 858| Type = PolymorphicBase # 858| ValueCategory = lvalue # 858| expr: d diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ir.expected index 0efec7a814a..f4e8483851d 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ir.expected @@ -3559,52 +3559,52 @@ ir.cpp: # 849| DynamicCast() -> void # 849| Block 0 -# 849| v0_0(void) = EnterFunction : -# 849| mu0_1(unknown) = UnmodeledDefinition : -# 850| r0_2(glval) = VariableAddress[b] : -#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_4(void) = Invoke : r0_3, this:r0_2 -# 851| r0_5(glval) = VariableAddress[d] : -# 851| r0_6(glval) = FunctionAddress[PolymorphicDerived] : -# 851| v0_7(void) = Invoke : r0_6, this:r0_5 -# 853| r0_8(glval) = VariableAddress[pb] : -# 853| r0_9(glval) = VariableAddress[b] : -# 853| m0_10(PolymorphicBase *) = Store : r0_8, r0_9 -# 854| r0_11(glval) = VariableAddress[pd] : -# 854| r0_12(glval) = VariableAddress[d] : -# 854| m0_13(PolymorphicDerived *) = Store : r0_11, r0_12 -# 857| r0_14(glval) = VariableAddress[pd] : -# 857| r0_15(PolymorphicDerived *) = Load : r0_14, m0_13 -# 857| r0_16(PolymorphicBase *) = ConvertToBase[PolymorphicDerived : PolymorphicBase] : r0_15 -# 857| r0_17(glval) = VariableAddress[pb] : -# 857| m0_18(PolymorphicBase *) = Store : r0_17, r0_16 -# 858| r0_19(glval) = VariableAddress[rb] : -# 858| r0_20(glval) = VariableAddress[d] : -# 858| r0_21(glval) = ConvertToBase[PolymorphicDerived : PolymorphicBase] : r0_20 -# 858| m0_22(PolymorphicBase &) = Store : r0_19, r0_21 -# 860| r0_23(glval) = VariableAddress[pb] : -# 860| r0_24(PolymorphicBase *) = Load : r0_23, m0_18 -# 860| r0_25(PolymorphicDerived *) = CheckedConvertOrNull : r0_24 -# 860| r0_26(glval) = VariableAddress[pd] : -# 860| m0_27(PolymorphicDerived *) = Store : r0_26, r0_25 -# 861| r0_28(glval) = VariableAddress[rd] : -# 861| r0_29(glval) = VariableAddress[b] : -# 861| r0_30(glval) = CheckedConvertOrThrow : r0_29 -# 861| m0_31(PolymorphicDerived &) = Store : r0_28, r0_30 -# 863| r0_32(glval) = VariableAddress[pv] : -# 863| r0_33(glval) = VariableAddress[pb] : -# 863| r0_34(PolymorphicBase *) = Load : r0_33, m0_18 -# 863| r0_35(void *) = DynamicCastToVoid : r0_34 -# 863| m0_36(void *) = Store : r0_32, r0_35 -# 864| r0_37(glval) = VariableAddress[pcv] : -# 864| r0_38(glval) = VariableAddress[pd] : -# 864| r0_39(PolymorphicDerived *) = Load : r0_38, m0_27 -# 864| r0_40(void *) = DynamicCastToVoid : r0_39 -# 864| m0_41(void *) = Store : r0_37, r0_40 -# 865| v0_42(void) = NoOp : -# 849| v0_43(void) = ReturnVoid : -# 849| v0_44(void) = UnmodeledUse : mu* -# 849| v0_45(void) = ExitFunction : +# 849| v0_0(void) = EnterFunction : +# 849| mu0_1(unknown) = UnmodeledDefinition : +# 850| r0_2(glval) = VariableAddress[b] : +#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : +#-----| v0_4(void) = Invoke : r0_3, this:r0_2 +# 851| r0_5(glval) = VariableAddress[d] : +# 851| r0_6(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v0_7(void) = Invoke : r0_6, this:r0_5 +# 853| r0_8(glval) = VariableAddress[pb] : +# 853| r0_9(glval) = VariableAddress[b] : +# 853| m0_10(PolymorphicBase *) = Store : r0_8, r0_9 +# 854| r0_11(glval) = VariableAddress[pd] : +# 854| r0_12(glval) = VariableAddress[d] : +# 854| m0_13(PolymorphicDerived *) = Store : r0_11, r0_12 +# 857| r0_14(glval) = VariableAddress[pd] : +# 857| r0_15(PolymorphicDerived *) = Load : r0_14, m0_13 +# 857| r0_16(PolymorphicBase *) = CheckedConvertOrNull : r0_15 +# 857| r0_17(glval) = VariableAddress[pb] : +# 857| m0_18(PolymorphicBase *) = Store : r0_17, r0_16 +# 858| r0_19(glval) = VariableAddress[rb] : +# 858| r0_20(glval) = VariableAddress[d] : +# 858| r0_21(glval) = CheckedConvertOrThrow : r0_20 +# 858| m0_22(PolymorphicBase &) = Store : r0_19, r0_21 +# 860| r0_23(glval) = VariableAddress[pb] : +# 860| r0_24(PolymorphicBase *) = Load : r0_23, m0_18 +# 860| r0_25(PolymorphicDerived *) = CheckedConvertOrNull : r0_24 +# 860| r0_26(glval) = VariableAddress[pd] : +# 860| m0_27(PolymorphicDerived *) = Store : r0_26, r0_25 +# 861| r0_28(glval) = VariableAddress[rd] : +# 861| r0_29(glval) = VariableAddress[b] : +# 861| r0_30(glval) = CheckedConvertOrThrow : r0_29 +# 861| m0_31(PolymorphicDerived &) = Store : r0_28, r0_30 +# 863| r0_32(glval) = VariableAddress[pv] : +# 863| r0_33(glval) = VariableAddress[pb] : +# 863| r0_34(PolymorphicBase *) = Load : r0_33, m0_18 +# 863| r0_35(void *) = DynamicCastToVoid : r0_34 +# 863| m0_36(void *) = Store : r0_32, r0_35 +# 864| r0_37(glval) = VariableAddress[pcv] : +# 864| r0_38(glval) = VariableAddress[pd] : +# 864| r0_39(PolymorphicDerived *) = Load : r0_38, m0_27 +# 864| r0_40(void *) = DynamicCastToVoid : r0_39 +# 864| m0_41(void *) = Store : r0_37, r0_40 +# 865| v0_42(void) = NoOp : +# 849| v0_43(void) = ReturnVoid : +# 849| v0_44(void) = UnmodeledUse : mu* +# 849| v0_45(void) = ExitFunction : # 867| String::String() -> void # 867| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ir.expected b/cpp/ql/test/library-tests/ir/ir/ir.expected index 5ed119f70b7..8087073ce7d 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/ir.expected @@ -3539,52 +3539,52 @@ ir.cpp: # 849| DynamicCast() -> void # 849| Block 0 -# 849| v0_0(void) = EnterFunction : -# 849| mu0_1(unknown) = UnmodeledDefinition : -# 850| r0_2(glval) = VariableAddress[b] : -#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_4(void) = Invoke : r0_3, this:r0_2 -# 851| r0_5(glval) = VariableAddress[d] : -# 851| r0_6(glval) = FunctionAddress[PolymorphicDerived] : -# 851| v0_7(void) = Invoke : r0_6, this:r0_5 -# 853| r0_8(glval) = VariableAddress[pb] : -# 853| r0_9(glval) = VariableAddress[b] : -# 853| mu0_10(PolymorphicBase *) = Store : r0_8, r0_9 -# 854| r0_11(glval) = VariableAddress[pd] : -# 854| r0_12(glval) = VariableAddress[d] : -# 854| mu0_13(PolymorphicDerived *) = Store : r0_11, r0_12 -# 857| r0_14(glval) = VariableAddress[pd] : -# 857| r0_15(PolymorphicDerived *) = Load : r0_14, mu0_1 -# 857| r0_16(PolymorphicBase *) = ConvertToBase[PolymorphicDerived : PolymorphicBase] : r0_15 -# 857| r0_17(glval) = VariableAddress[pb] : -# 857| mu0_18(PolymorphicBase *) = Store : r0_17, r0_16 -# 858| r0_19(glval) = VariableAddress[rb] : -# 858| r0_20(glval) = VariableAddress[d] : -# 858| r0_21(glval) = ConvertToBase[PolymorphicDerived : PolymorphicBase] : r0_20 -# 858| mu0_22(PolymorphicBase &) = Store : r0_19, r0_21 -# 860| r0_23(glval) = VariableAddress[pb] : -# 860| r0_24(PolymorphicBase *) = Load : r0_23, mu0_1 -# 860| r0_25(PolymorphicDerived *) = CheckedConvertOrNull : r0_24 -# 860| r0_26(glval) = VariableAddress[pd] : -# 860| mu0_27(PolymorphicDerived *) = Store : r0_26, r0_25 -# 861| r0_28(glval) = VariableAddress[rd] : -# 861| r0_29(glval) = VariableAddress[b] : -# 861| r0_30(glval) = CheckedConvertOrThrow : r0_29 -# 861| mu0_31(PolymorphicDerived &) = Store : r0_28, r0_30 -# 863| r0_32(glval) = VariableAddress[pv] : -# 863| r0_33(glval) = VariableAddress[pb] : -# 863| r0_34(PolymorphicBase *) = Load : r0_33, mu0_1 -# 863| r0_35(void *) = DynamicCastToVoid : r0_34 -# 863| mu0_36(void *) = Store : r0_32, r0_35 -# 864| r0_37(glval) = VariableAddress[pcv] : -# 864| r0_38(glval) = VariableAddress[pd] : -# 864| r0_39(PolymorphicDerived *) = Load : r0_38, mu0_1 -# 864| r0_40(void *) = DynamicCastToVoid : r0_39 -# 864| mu0_41(void *) = Store : r0_37, r0_40 -# 865| v0_42(void) = NoOp : -# 849| v0_43(void) = ReturnVoid : -# 849| v0_44(void) = UnmodeledUse : mu* -# 849| v0_45(void) = ExitFunction : +# 849| v0_0(void) = EnterFunction : +# 849| mu0_1(unknown) = UnmodeledDefinition : +# 850| r0_2(glval) = VariableAddress[b] : +#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : +#-----| v0_4(void) = Invoke : r0_3, this:r0_2 +# 851| r0_5(glval) = VariableAddress[d] : +# 851| r0_6(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v0_7(void) = Invoke : r0_6, this:r0_5 +# 853| r0_8(glval) = VariableAddress[pb] : +# 853| r0_9(glval) = VariableAddress[b] : +# 853| mu0_10(PolymorphicBase *) = Store : r0_8, r0_9 +# 854| r0_11(glval) = VariableAddress[pd] : +# 854| r0_12(glval) = VariableAddress[d] : +# 854| mu0_13(PolymorphicDerived *) = Store : r0_11, r0_12 +# 857| r0_14(glval) = VariableAddress[pd] : +# 857| r0_15(PolymorphicDerived *) = Load : r0_14, mu0_1 +# 857| r0_16(PolymorphicBase *) = CheckedConvertOrNull : r0_15 +# 857| r0_17(glval) = VariableAddress[pb] : +# 857| mu0_18(PolymorphicBase *) = Store : r0_17, r0_16 +# 858| r0_19(glval) = VariableAddress[rb] : +# 858| r0_20(glval) = VariableAddress[d] : +# 858| r0_21(glval) = CheckedConvertOrThrow : r0_20 +# 858| mu0_22(PolymorphicBase &) = Store : r0_19, r0_21 +# 860| r0_23(glval) = VariableAddress[pb] : +# 860| r0_24(PolymorphicBase *) = Load : r0_23, mu0_1 +# 860| r0_25(PolymorphicDerived *) = CheckedConvertOrNull : r0_24 +# 860| r0_26(glval) = VariableAddress[pd] : +# 860| mu0_27(PolymorphicDerived *) = Store : r0_26, r0_25 +# 861| r0_28(glval) = VariableAddress[rd] : +# 861| r0_29(glval) = VariableAddress[b] : +# 861| r0_30(glval) = CheckedConvertOrThrow : r0_29 +# 861| mu0_31(PolymorphicDerived &) = Store : r0_28, r0_30 +# 863| r0_32(glval) = VariableAddress[pv] : +# 863| r0_33(glval) = VariableAddress[pb] : +# 863| r0_34(PolymorphicBase *) = Load : r0_33, mu0_1 +# 863| r0_35(void *) = DynamicCastToVoid : r0_34 +# 863| mu0_36(void *) = Store : r0_32, r0_35 +# 864| r0_37(glval) = VariableAddress[pcv] : +# 864| r0_38(glval) = VariableAddress[pd] : +# 864| r0_39(PolymorphicDerived *) = Load : r0_38, mu0_1 +# 864| r0_40(void *) = DynamicCastToVoid : r0_39 +# 864| mu0_41(void *) = Store : r0_37, r0_40 +# 865| v0_42(void) = NoOp : +# 849| v0_43(void) = ReturnVoid : +# 849| v0_44(void) = UnmodeledUse : mu* +# 849| v0_45(void) = ExitFunction : # 867| String::String() -> void # 867| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ssa_ir.expected b/cpp/ql/test/library-tests/ir/ir/ssa_ir.expected index c168845702b..e249ce3ce02 100644 --- a/cpp/ql/test/library-tests/ir/ir/ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/ssa_ir.expected @@ -3559,52 +3559,52 @@ ir.cpp: # 849| DynamicCast() -> void # 849| Block 0 -# 849| v0_0(void) = EnterFunction : -# 849| mu0_1(unknown) = UnmodeledDefinition : -# 850| r0_2(glval) = VariableAddress[b] : -#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_4(void) = Invoke : r0_3, this:r0_2 -# 851| r0_5(glval) = VariableAddress[d] : -# 851| r0_6(glval) = FunctionAddress[PolymorphicDerived] : -# 851| v0_7(void) = Invoke : r0_6, this:r0_5 -# 853| r0_8(glval) = VariableAddress[pb] : -# 853| r0_9(glval) = VariableAddress[b] : -# 853| m0_10(PolymorphicBase *) = Store : r0_8, r0_9 -# 854| r0_11(glval) = VariableAddress[pd] : -# 854| r0_12(glval) = VariableAddress[d] : -# 854| m0_13(PolymorphicDerived *) = Store : r0_11, r0_12 -# 857| r0_14(glval) = VariableAddress[pd] : -# 857| r0_15(PolymorphicDerived *) = Load : r0_14, m0_13 -# 857| r0_16(PolymorphicBase *) = ConvertToBase[PolymorphicDerived : PolymorphicBase] : r0_15 -# 857| r0_17(glval) = VariableAddress[pb] : -# 857| m0_18(PolymorphicBase *) = Store : r0_17, r0_16 -# 858| r0_19(glval) = VariableAddress[rb] : -# 858| r0_20(glval) = VariableAddress[d] : -# 858| r0_21(glval) = ConvertToBase[PolymorphicDerived : PolymorphicBase] : r0_20 -# 858| m0_22(PolymorphicBase &) = Store : r0_19, r0_21 -# 860| r0_23(glval) = VariableAddress[pb] : -# 860| r0_24(PolymorphicBase *) = Load : r0_23, m0_18 -# 860| r0_25(PolymorphicDerived *) = CheckedConvertOrNull : r0_24 -# 860| r0_26(glval) = VariableAddress[pd] : -# 860| m0_27(PolymorphicDerived *) = Store : r0_26, r0_25 -# 861| r0_28(glval) = VariableAddress[rd] : -# 861| r0_29(glval) = VariableAddress[b] : -# 861| r0_30(glval) = CheckedConvertOrThrow : r0_29 -# 861| m0_31(PolymorphicDerived &) = Store : r0_28, r0_30 -# 863| r0_32(glval) = VariableAddress[pv] : -# 863| r0_33(glval) = VariableAddress[pb] : -# 863| r0_34(PolymorphicBase *) = Load : r0_33, m0_18 -# 863| r0_35(void *) = DynamicCastToVoid : r0_34 -# 863| m0_36(void *) = Store : r0_32, r0_35 -# 864| r0_37(glval) = VariableAddress[pcv] : -# 864| r0_38(glval) = VariableAddress[pd] : -# 864| r0_39(PolymorphicDerived *) = Load : r0_38, m0_27 -# 864| r0_40(void *) = DynamicCastToVoid : r0_39 -# 864| m0_41(void *) = Store : r0_37, r0_40 -# 865| v0_42(void) = NoOp : -# 849| v0_43(void) = ReturnVoid : -# 849| v0_44(void) = UnmodeledUse : mu* -# 849| v0_45(void) = ExitFunction : +# 849| v0_0(void) = EnterFunction : +# 849| mu0_1(unknown) = UnmodeledDefinition : +# 850| r0_2(glval) = VariableAddress[b] : +#-----| r0_3(glval) = FunctionAddress[PolymorphicBase] : +#-----| v0_4(void) = Invoke : r0_3, this:r0_2 +# 851| r0_5(glval) = VariableAddress[d] : +# 851| r0_6(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v0_7(void) = Invoke : r0_6, this:r0_5 +# 853| r0_8(glval) = VariableAddress[pb] : +# 853| r0_9(glval) = VariableAddress[b] : +# 853| m0_10(PolymorphicBase *) = Store : r0_8, r0_9 +# 854| r0_11(glval) = VariableAddress[pd] : +# 854| r0_12(glval) = VariableAddress[d] : +# 854| m0_13(PolymorphicDerived *) = Store : r0_11, r0_12 +# 857| r0_14(glval) = VariableAddress[pd] : +# 857| r0_15(PolymorphicDerived *) = Load : r0_14, m0_13 +# 857| r0_16(PolymorphicBase *) = CheckedConvertOrNull : r0_15 +# 857| r0_17(glval) = VariableAddress[pb] : +# 857| m0_18(PolymorphicBase *) = Store : r0_17, r0_16 +# 858| r0_19(glval) = VariableAddress[rb] : +# 858| r0_20(glval) = VariableAddress[d] : +# 858| r0_21(glval) = CheckedConvertOrThrow : r0_20 +# 858| m0_22(PolymorphicBase &) = Store : r0_19, r0_21 +# 860| r0_23(glval) = VariableAddress[pb] : +# 860| r0_24(PolymorphicBase *) = Load : r0_23, m0_18 +# 860| r0_25(PolymorphicDerived *) = CheckedConvertOrNull : r0_24 +# 860| r0_26(glval) = VariableAddress[pd] : +# 860| m0_27(PolymorphicDerived *) = Store : r0_26, r0_25 +# 861| r0_28(glval) = VariableAddress[rd] : +# 861| r0_29(glval) = VariableAddress[b] : +# 861| r0_30(glval) = CheckedConvertOrThrow : r0_29 +# 861| m0_31(PolymorphicDerived &) = Store : r0_28, r0_30 +# 863| r0_32(glval) = VariableAddress[pv] : +# 863| r0_33(glval) = VariableAddress[pb] : +# 863| r0_34(PolymorphicBase *) = Load : r0_33, m0_18 +# 863| r0_35(void *) = DynamicCastToVoid : r0_34 +# 863| m0_36(void *) = Store : r0_32, r0_35 +# 864| r0_37(glval) = VariableAddress[pcv] : +# 864| r0_38(glval) = VariableAddress[pd] : +# 864| r0_39(PolymorphicDerived *) = Load : r0_38, m0_27 +# 864| r0_40(void *) = DynamicCastToVoid : r0_39 +# 864| m0_41(void *) = Store : r0_37, r0_40 +# 865| v0_42(void) = NoOp : +# 849| v0_43(void) = ReturnVoid : +# 849| v0_44(void) = UnmodeledUse : mu* +# 849| v0_45(void) = ExitFunction : # 867| String::String() -> void # 867| Block 0