From dd169d1b2183ac078d91e3718d3919e74f81954e Mon Sep 17 00:00:00 2001 From: Nick Rolfe Date: Wed, 15 Aug 2018 11:43:31 +0100 Subject: [PATCH 1/5] C++: fix test to enable C++11 support in frontend --- .../clang_builtin_macros/{extended.c => extended.cpp} | 3 ++- .../test/library-tests/clang_builtin_macros/values.expected | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) rename cpp/ql/test/library-tests/clang_builtin_macros/{extended.c => extended.cpp} (60%) diff --git a/cpp/ql/test/library-tests/clang_builtin_macros/extended.c b/cpp/ql/test/library-tests/clang_builtin_macros/extended.cpp similarity index 60% rename from cpp/ql/test/library-tests/clang_builtin_macros/extended.c rename to cpp/ql/test/library-tests/clang_builtin_macros/extended.cpp index b38df35c9993..8b3ab9d48c50 100644 --- a/cpp/ql/test/library-tests/clang_builtin_macros/extended.c +++ b/cpp/ql/test/library-tests/clang_builtin_macros/extended.cpp @@ -1,3 +1,4 @@ +// semmle-extractor-options: --edg --clang --edg --c++11 --edg --nullptr + static int has_nullptr_f = __has_feature(cxx_nullptr); static int has_nullptr_e = __has_extension(cxx_nullptr); -// semmle-extractor-options: --edg --clang --edg --c++ --edg --nullptr diff --git a/cpp/ql/test/library-tests/clang_builtin_macros/values.expected b/cpp/ql/test/library-tests/clang_builtin_macros/values.expected index d51823065b6c..5e33ee8c946a 100644 --- a/cpp/ql/test/library-tests/clang_builtin_macros/values.expected +++ b/cpp/ql/test/library-tests/clang_builtin_macros/values.expected @@ -2,8 +2,8 @@ | | gp_offset | | | | overflow_arg_area | | | | reg_save_area | | -| extended.c | has_nullptr_e | 1 | -| extended.c | has_nullptr_f | 1 | +| extended.cpp | has_nullptr_e | 1 | +| extended.cpp | has_nullptr_f | 1 | | gcc492.c | has_include | 1 | | gcc492.c | has_macro_include | 1 | | gcc492.c | has_missing_include | 0 | From 04385a83baa6af1b0d85dcfe6a87dbe4caef5c39 Mon Sep 17 00:00:00 2001 From: Nick Rolfe Date: Wed, 15 Aug 2018 12:25:31 +0100 Subject: [PATCH 2/5] C++: fix tests: frontend no longer optimises dynamic_cast to base type --- .../library-tests/conversions/conversions.cpp | 4 +- .../conversions/conversions.expected | 4 +- .../library-tests/ir/ir/PrintAST.expected | 8 +- .../ir/ir/aliased_ssa_ir.expected | 92 +++++++++---------- cpp/ql/test/library-tests/ir/ir/ir.expected | 92 +++++++++---------- .../test/library-tests/ir/ir/ssa_ir.expected | 92 +++++++++---------- 6 files changed, 146 insertions(+), 146 deletions(-) diff --git a/cpp/ql/test/library-tests/conversions/conversions.cpp b/cpp/ql/test/library-tests/conversions/conversions.cpp index 5bc614cbf122..4fb1fa3c200c 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 8c4d8af8b62a..1aa02a15aaa8 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 475c191c67c8..a7da38c6d978 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 0efec7a814a6..f4e8483851d6 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 5ed119f70b7d..8087073ce7d1 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 c168845702b1..e249ce3ce020 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 From da7d70662bd583afde09fa94869a776da912b629 Mon Sep 17 00:00:00 2001 From: Nick Rolfe Date: Wed, 15 Aug 2018 17:25:41 +0100 Subject: [PATCH 3/5] C++: accept more test changes following extractor frontend upgrade --- cpp/ql/test/library-tests/friends/loop/friends.expected | 2 +- .../test/library-tests/templates/CPP-204/element.expected | 4 ++-- .../isfromuninstantiatedtemplate.expected | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cpp/ql/test/library-tests/friends/loop/friends.expected b/cpp/ql/test/library-tests/friends/loop/friends.expected index 0fa38a8b8546..a43c3f67c2eb 100644 --- a/cpp/ql/test/library-tests/friends/loop/friends.expected +++ b/cpp/ql/test/library-tests/friends/loop/friends.expected @@ -6,4 +6,4 @@ | file://:0:0:0:0 | F's friend | loop.cpp:5:26:5:26 | E | | loop.cpp:6:5:6:5 | E's friend | loop.cpp:5:26:5:26 | E | | loop.cpp:7:5:7:5 | E's friend | loop.cpp:7:36:7:36 | F | -| loop.cpp:11:5:11:5 | F's friend | loop.cpp:5:26:5:26 | E | +| loop.cpp:11:5:11:5 | F's friend | loop.cpp:11:36:11:36 | E | diff --git a/cpp/ql/test/library-tests/templates/CPP-204/element.expected b/cpp/ql/test/library-tests/templates/CPP-204/element.expected index 6242ab059370..c8a874108efb 100644 --- a/cpp/ql/test/library-tests/templates/CPP-204/element.expected +++ b/cpp/ql/test/library-tests/templates/CPP-204/element.expected @@ -29,7 +29,7 @@ | test.cpp:7:8:7:10 | IsX | | test.cpp:7:8:7:10 | definition of IsX | | test.cpp:8:23:8:27 | Value | -| test.cpp:8:23:8:27 | declaration of Value | +| test.cpp:8:23:8:27 | definition of Value | | test.cpp:8:31:8:35 | 0 | | test.cpp:8:31:8:35 | initializer for Value | | test.cpp:11:10:11:11 | mention of EC | @@ -43,7 +43,7 @@ | test.cpp:17:8:17:9 | IX | | test.cpp:17:8:17:9 | definition of IX | | test.cpp:18:21:18:25 | Value | -| test.cpp:18:21:18:25 | declaration of Value | +| test.cpp:18:21:18:25 | definition of Value | | test.cpp:18:29:18:32 | EC:: | | test.cpp:18:29:18:33 | V | | test.cpp:18:29:18:33 | initializer for Value | diff --git a/cpp/ql/test/library-tests/templates/isfromtemplateinstantiation/isfromuninstantiatedtemplate.expected b/cpp/ql/test/library-tests/templates/isfromtemplateinstantiation/isfromuninstantiatedtemplate.expected index 0536996230c6..38fda5364eef 100644 --- a/cpp/ql/test/library-tests/templates/isfromtemplateinstantiation/isfromuninstantiatedtemplate.expected +++ b/cpp/ql/test/library-tests/templates/isfromtemplateinstantiation/isfromuninstantiatedtemplate.expected @@ -1,6 +1,8 @@ isFromUninstantiatedTemplate -| file://:0:0:0:0 | Unknown literal | isfromtemplateinstantiation.cpp:77:26:77:45 | AnotherTemplateClass | -| file://:0:0:0:0 | Unknown literal | isfromtemplateinstantiation.cpp:77:26:77:45 | AnotherTemplateClass | +| file://:0:0:0:0 | 0 | isfromtemplateinstantiation.cpp:77:26:77:45 | AnotherTemplateClass | +| file://:0:0:0:0 | 0 | isfromtemplateinstantiation.cpp:77:26:77:45 | AnotherTemplateClass | +| file://:0:0:0:0 | (int)... | isfromtemplateinstantiation.cpp:77:26:77:45 | AnotherTemplateClass | +| file://:0:0:0:0 | (int)... | isfromtemplateinstantiation.cpp:77:26:77:45 | AnotherTemplateClass | | file://:0:0:0:0 | declaration of 1st parameter | isfromtemplateinstantiation.cpp:134:29:134:33 | Outer | | file://:0:0:0:0 | declaration of 1st parameter | isfromtemplateinstantiation.cpp:134:29:134:33 | Outer | | file://:0:0:0:0 | initializer for MyClassEnumConst | isfromtemplateinstantiation.cpp:77:26:77:45 | AnotherTemplateClass | From 193e013196d6e8a39129cf600942e98e22ab4353 Mon Sep 17 00:00:00 2001 From: Nick Rolfe Date: Fri, 17 Aug 2018 17:29:23 +0100 Subject: [PATCH 4/5] C++: accept more extraction of functions in local classes/lambdas --- .../lambdas/captures/elements.expected | 4 + .../library-tests/lambdas/cfg/cfg.expected | 196 +++++++++--------- .../library-tests/lambdas/cfg/stmts.expected | 4 + 3 files changed, 111 insertions(+), 93 deletions(-) diff --git a/cpp/ql/test/library-tests/lambdas/captures/elements.expected b/cpp/ql/test/library-tests/lambdas/captures/elements.expected index 0000487e2ff7..52f85b0392df 100644 --- a/cpp/ql/test/library-tests/lambdas/captures/elements.expected +++ b/cpp/ql/test/library-tests/lambdas/captures/elements.expected @@ -86,11 +86,15 @@ | end_pos.cpp:9:15:9:15 | (constructor) | | end_pos.cpp:9:15:9:15 | (constructor) | | end_pos.cpp:9:15:9:15 | (constructor) | +| end_pos.cpp:9:15:9:15 | Unknown literal | +| end_pos.cpp:9:15:9:15 | constructor init of field ii | | end_pos.cpp:9:15:9:15 | declaration of (null) | | end_pos.cpp:9:15:9:15 | definition of (null) | | end_pos.cpp:9:15:9:15 | definition of (null) | | end_pos.cpp:9:15:9:15 | definition of operator= | | end_pos.cpp:9:15:9:15 | operator= | +| end_pos.cpp:9:15:9:15 | return ... | +| end_pos.cpp:9:15:9:15 | { ... } | | end_pos.cpp:9:15:11:5 | [...](...){...} | | end_pos.cpp:9:15:11:5 | {...} | | end_pos.cpp:9:17:9:17 | definition of ii | diff --git a/cpp/ql/test/library-tests/lambdas/cfg/cfg.expected b/cpp/ql/test/library-tests/lambdas/cfg/cfg.expected index da693902885b..cd73b85be0cb 100644 --- a/cpp/ql/test/library-tests/lambdas/cfg/cfg.expected +++ b/cpp/ql/test/library-tests/lambdas/cfg/cfg.expected @@ -1,93 +1,103 @@ -| | false | 160 | 160 | operator() | -| | false | 166 | 166 | declaration | -| | false | 168 | 168 | call to printf | -| | false | 172 | 172 | Running with %d and %d\n | -| | false | 173 | 173 | array to pointer conversion | -| | false | 175 | 175 | (char *)... | -| | false | 177 | 177 | x | -| | false | 179 | 179 | y | -| | false | 181 | 181 | ExprStmt | -| | false | 183 | 183 | z | -| | false | 185 | 185 | x | -| | false | 187 | 187 | y | -| | false | 189 | 189 | ... + ... | -| | false | 191 | 191 | ... = ... | -| | false | 193 | 193 | ExprStmt | -| | false | 195 | 195 | call to printf | -| | false | 199 | 199 | Returning %d %d\n | -| | false | 200 | 200 | array to pointer conversion | -| | false | 202 | 202 | (char *)... | -| | false | 204 | 204 | z | -| | false | 206 | 206 | z | -| | false | 208 | 208 | ExprStmt | -| | false | 210 | 210 | z | -| | false | 212 | 212 | return ... | -| | false | 214 | 214 | { ... } | -| | false | 216 | 216 | operator auto (*)(int, int)->int | -| | false | 219 | 219 | (constructor) | -| | false | 223 | 223 | (constructor) | -| | false | 225 | 225 | operator= | -| | false | 227 | 227 | (constructor) | -| | false | 228 | 228 | _FUN | -| | true | 166 | 181 | | -| | true | 168 | 193 | | -| | true | 172 | 177 | | -| | true | 177 | 179 | | -| | true | 179 | 168 | | -| | true | 181 | 172 | | -| | true | 183 | 191 | | -| | true | 185 | 187 | | -| | true | 187 | 189 | | -| | true | 189 | 183 | | -| | true | 191 | 208 | | -| | true | 193 | 185 | | -| | true | 195 | 212 | | -| | true | 199 | 204 | | -| | true | 204 | 206 | | -| | true | 206 | 195 | | -| | true | 208 | 199 | | -| | true | 210 | 160 | | -| | true | 212 | 210 | | -| | true | 214 | 166 | | -| __va_list_tag::operator= | false | 61 | 61 | operator= | -| __va_list_tag::operator= | false | 65 | 65 | operator= | -| main | false | 153 | 153 | main | -| main | false | 251 | 251 | [...](...){...} | -| main | false | 253 | 253 | initializer for myLambda | -| main | false | 257 | 257 | declaration | -| main | false | 259 | 259 | call to printf | -| main | false | 265 | 265 | Some results: %d %d\n | -| main | false | 266 | 266 | array to pointer conversion | -| main | false | 268 | 268 | (char *)... | -| main | false | 272 | 272 | call to operator() | -| main | false | 274 | 274 | myLambda | -| main | false | 276 | 276 | (const lambda [] type at line 12, col. 21)... | -| main | false | 280 | 280 | 5 | -| main | false | 283 | 283 | 6 | -| main | false | 284 | 284 | call to operator() | -| main | false | 286 | 286 | myLambda | -| main | false | 288 | 288 | (const lambda [] type at line 12, col. 21)... | -| main | false | 292 | 292 | 7 | -| main | false | 295 | 295 | 8 | -| main | false | 296 | 296 | ExprStmt | -| main | false | 300 | 300 | 0 | -| main | false | 301 | 301 | return ... | -| main | false | 303 | 303 | { ... } | -| main | true | 251 | 296 | | -| main | true | 253 | 251 | | -| main | true | 257 | 253 | | -| main | true | 259 | 301 | | -| main | true | 265 | 280 | | -| main | true | 272 | 292 | | -| main | true | 274 | 272 | | -| main | true | 280 | 283 | | -| main | true | 283 | 274 | | -| main | true | 284 | 259 | | -| main | true | 286 | 284 | | -| main | true | 292 | 295 | | -| main | true | 295 | 286 | | -| main | true | 296 | 265 | | -| main | true | 300 | 153 | | -| main | true | 301 | 300 | | -| main | true | 303 | 257 | | -| printf | false | 138 | 138 | printf | +| | false | 102 | 102 | operator() | +| | false | 108 | 108 | declaration | +| | false | 110 | 110 | call to printf | +| | false | 114 | 114 | Running with %d and %d\n | +| | false | 115 | 115 | array to pointer conversion | +| | false | 117 | 117 | (char *)... | +| | false | 119 | 119 | x | +| | false | 121 | 121 | y | +| | false | 123 | 123 | ExprStmt | +| | false | 125 | 125 | z | +| | false | 127 | 127 | x | +| | false | 129 | 129 | y | +| | false | 131 | 131 | ... + ... | +| | false | 133 | 133 | ... = ... | +| | false | 135 | 135 | ExprStmt | +| | false | 137 | 137 | call to printf | +| | false | 141 | 141 | Returning %d %d\n | +| | false | 142 | 142 | array to pointer conversion | +| | false | 144 | 144 | (char *)... | +| | false | 146 | 146 | z | +| | false | 148 | 148 | z | +| | false | 150 | 150 | ExprStmt | +| | false | 152 | 152 | z | +| | false | 154 | 154 | return ... | +| | false | 156 | 156 | { ... } | +| | false | 160 | 160 | operator auto (*)(int, int)->int | +| | false | 161 | 161 | _FUN | +| | false | 164 | 164 | _FUN | +| | false | 166 | 166 | return ... | +| | false | 168 | 168 | { ... } | +| | false | 173 | 173 | (constructor) | +| | false | 175 | 175 | return ... | +| | false | 177 | 177 | { ... } | +| | false | 183 | 183 | (constructor) | +| | false | 186 | 186 | operator= | +| | false | 188 | 188 | (constructor) | +| | true | 108 | 123 | | +| | true | 110 | 135 | | +| | true | 114 | 119 | | +| | true | 119 | 121 | | +| | true | 121 | 110 | | +| | true | 123 | 114 | | +| | true | 125 | 133 | | +| | true | 127 | 129 | | +| | true | 129 | 131 | | +| | true | 131 | 125 | | +| | true | 133 | 150 | | +| | true | 135 | 127 | | +| | true | 137 | 154 | | +| | true | 141 | 146 | | +| | true | 146 | 148 | | +| | true | 148 | 137 | | +| | true | 150 | 141 | | +| | true | 152 | 102 | | +| | true | 154 | 152 | | +| | true | 156 | 108 | | +| | true | 164 | 160 | | +| | true | 166 | 164 | | +| | true | 168 | 166 | | +| | true | 175 | 173 | | +| | true | 177 | 175 | | +| __va_list_tag::operator= | false | 60 | 60 | operator= | +| __va_list_tag::operator= | false | 66 | 66 | operator= | +| main | false | 95 | 95 | main | +| main | false | 199 | 199 | [...](...){...} | +| main | false | 201 | 201 | initializer for myLambda | +| main | false | 205 | 205 | declaration | +| main | false | 207 | 207 | call to printf | +| main | false | 213 | 213 | Some results: %d %d\n | +| main | false | 214 | 214 | array to pointer conversion | +| main | false | 216 | 216 | (char *)... | +| main | false | 220 | 220 | call to operator() | +| main | false | 222 | 222 | myLambda | +| main | false | 224 | 224 | (const lambda [] type at line 12, col. 21)... | +| main | false | 228 | 228 | 5 | +| main | false | 231 | 231 | 6 | +| main | false | 232 | 232 | call to operator() | +| main | false | 234 | 234 | myLambda | +| main | false | 236 | 236 | (const lambda [] type at line 12, col. 21)... | +| main | false | 240 | 240 | 7 | +| main | false | 243 | 243 | 8 | +| main | false | 244 | 244 | ExprStmt | +| main | false | 248 | 248 | 0 | +| main | false | 249 | 249 | return ... | +| main | false | 251 | 251 | { ... } | +| main | true | 199 | 244 | | +| main | true | 201 | 199 | | +| main | true | 205 | 201 | | +| main | true | 207 | 249 | | +| main | true | 213 | 228 | | +| main | true | 220 | 240 | | +| main | true | 222 | 220 | | +| main | true | 228 | 231 | | +| main | true | 231 | 222 | | +| main | true | 232 | 207 | | +| main | true | 234 | 232 | | +| main | true | 240 | 243 | | +| main | true | 243 | 234 | | +| main | true | 244 | 213 | | +| main | true | 248 | 95 | | +| main | true | 249 | 248 | | +| main | true | 251 | 205 | | +| printf | false | 84 | 84 | printf | diff --git a/cpp/ql/test/library-tests/lambdas/cfg/stmts.expected b/cpp/ql/test/library-tests/lambdas/cfg/stmts.expected index 94450f3c36d4..e4a207d78560 100644 --- a/cpp/ql/test/library-tests/lambdas/cfg/stmts.expected +++ b/cpp/ql/test/library-tests/lambdas/cfg/stmts.expected @@ -1,5 +1,9 @@ +| file://:0:0:0:0 | { ... } | lambda_cfg.cpp:12:24:12:24 | operator auto (*)(int, int)->int | | lambda_cfg.cpp:11:16:23:1 | { ... } | lambda_cfg.cpp:11:5:11:8 | main | | lambda_cfg.cpp:12:5:18:6 | declaration | lambda_cfg.cpp:11:5:11:8 | main | +| lambda_cfg.cpp:12:21:12:21 | return ... | lambda_cfg.cpp:12:21:12:21 | (constructor) | +| lambda_cfg.cpp:12:21:12:21 | { ... } | lambda_cfg.cpp:12:21:12:21 | (constructor) | +| lambda_cfg.cpp:12:24:12:24 | return ... | lambda_cfg.cpp:12:24:12:24 | operator auto (*)(int, int)->int | | lambda_cfg.cpp:12:46:18:5 | { ... } | lambda_cfg.cpp:12:24:12:24 | operator() | | lambda_cfg.cpp:13:9:13:14 | declaration | lambda_cfg.cpp:12:24:12:24 | operator() | | lambda_cfg.cpp:14:9:14:49 | ExprStmt | lambda_cfg.cpp:12:24:12:24 | operator() | From 7cf550a70f92fa422a9220c740d6b00fd191bfb2 Mon Sep 17 00:00:00 2001 From: Nick Rolfe Date: Thu, 23 Aug 2018 17:48:24 +0100 Subject: [PATCH 5/5] C++: regression test for extractor bug with enum in template class --- .../library-tests/templates/switch/test.cpp | 23 +++++++++++++++++++ .../templates/switch/test.expected | 2 ++ .../library-tests/templates/switch/test.ql | 4 ++++ 3 files changed, 29 insertions(+) create mode 100644 cpp/ql/test/library-tests/templates/switch/test.cpp create mode 100644 cpp/ql/test/library-tests/templates/switch/test.expected create mode 100644 cpp/ql/test/library-tests/templates/switch/test.ql diff --git a/cpp/ql/test/library-tests/templates/switch/test.cpp b/cpp/ql/test/library-tests/templates/switch/test.cpp new file mode 100644 index 000000000000..4da12e52f924 --- /dev/null +++ b/cpp/ql/test/library-tests/templates/switch/test.cpp @@ -0,0 +1,23 @@ + +// A regression test for a bug extracting the enum constants in a template +// class. + +template +class C { + enum { foo, bar, baz } delim; + void f(); +}; + +template +void C::f() { + switch (delim) { + case bar: + break; + case baz: + break; + case foo: + break; + } +} + +template class C; diff --git a/cpp/ql/test/library-tests/templates/switch/test.expected b/cpp/ql/test/library-tests/templates/switch/test.expected new file mode 100644 index 000000000000..b4124494ffeb --- /dev/null +++ b/cpp/ql/test/library-tests/templates/switch/test.expected @@ -0,0 +1,2 @@ +| test.cpp:13:3:20:3 | switch (...) ... | 3 | +| test.cpp:13:3:20:3 | switch (...) ... | 3 | diff --git a/cpp/ql/test/library-tests/templates/switch/test.ql b/cpp/ql/test/library-tests/templates/switch/test.ql new file mode 100644 index 000000000000..f9de6d417e55 --- /dev/null +++ b/cpp/ql/test/library-tests/templates/switch/test.ql @@ -0,0 +1,4 @@ +import cpp + +from SwitchStmt ss +select ss, count(SwitchCase sc | ss = sc.getSwitchStmt())