66#include " clang/Interpreter/CppInterOp.h"
77#include " clang/Sema/Sema.h"
88
9+ #include " clang-c/CXCppInterOp.h"
10+
911#include " gtest/gtest.h"
1012
1113#include < string>
@@ -105,6 +107,20 @@ TEST(FunctionReflectionTest, GetClassMethods) {
105107 std::vector<Cpp::TCppFunction_t> methods5;
106108 Cpp::GetClassMethods (nullptr , methods5);
107109 EXPECT_EQ (methods5.size (), 0 );
110+
111+ // C API
112+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
113+ auto C_API_SHIM = [&](Cpp::TCppFunction_t method) {
114+ auto Str = clang_getFunctionSignature (
115+ make_scope (static_cast <clang::Decl*>(method), I));
116+ auto Res = std::string (get_c_string (Str));
117+ dispose_string (Str);
118+ return Res;
119+ };
120+ EXPECT_EQ (C_API_SHIM (methods0[0 ]), " int A::f1(int a, int b)" );
121+ // Clean up resources
122+ clang_Interpreter_takeInterpreterAsPtr (I);
123+ clang_Interpreter_dispose (I);
108124}
109125
110126TEST (FunctionReflectionTest, ConstructorInGetClassMethods) {
@@ -161,6 +177,15 @@ TEST(FunctionReflectionTest, HasDefaultConstructor) {
161177 EXPECT_TRUE (Cpp::HasDefaultConstructor (Decls[0 ]));
162178 EXPECT_TRUE (Cpp::HasDefaultConstructor (Decls[1 ]));
163179 EXPECT_FALSE (Cpp::HasDefaultConstructor (Decls[3 ]));
180+
181+ // C API
182+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
183+ EXPECT_TRUE (clang_hasDefaultConstructor (make_scope (Decls[0 ], I)));
184+ EXPECT_TRUE (clang_hasDefaultConstructor (make_scope (Decls[1 ], I)));
185+ EXPECT_FALSE (clang_hasDefaultConstructor (make_scope (Decls[3 ], I)));
186+ // Clean up resources
187+ clang_Interpreter_takeInterpreterAsPtr (I);
188+ clang_Interpreter_dispose (I);
164189}
165190
166191TEST (FunctionReflectionTest, GetDestructor) {
@@ -189,6 +214,14 @@ TEST(FunctionReflectionTest, GetDestructor) {
189214 EXPECT_TRUE (DeletedDtor);
190215 EXPECT_TRUE (Cpp::IsFunctionDeleted (DeletedDtor));
191216 EXPECT_FALSE (Cpp::GetDestructor (Decls[3 ]));
217+
218+ // C API
219+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
220+ EXPECT_TRUE (clang_getDestructor (make_scope (Decls[0 ], I)).data [0 ]);
221+ EXPECT_TRUE (clang_getDestructor (make_scope (Decls[1 ], I)).data [0 ]);
222+ // Clean up resources
223+ clang_Interpreter_takeInterpreterAsPtr (I);
224+ clang_Interpreter_dispose (I);
192225}
193226
194227TEST (FunctionReflectionTest, GetFunctionsUsingName) {
@@ -524,6 +557,17 @@ TEST(FunctionReflectionTest, IsTemplatedFunction) {
524557 EXPECT_FALSE (Cpp::IsTemplatedFunction (Decls[3 ]));
525558 EXPECT_FALSE (Cpp::IsTemplatedFunction (SubDeclsC1[1 ]));
526559 EXPECT_TRUE (Cpp::IsTemplatedFunction (SubDeclsC1[2 ]));
560+
561+ // C API
562+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
563+ EXPECT_FALSE (clang_isTemplatedFunction (make_scope (Decls[0 ], I)));
564+ EXPECT_TRUE (clang_isTemplatedFunction (make_scope (Decls[1 ], I)));
565+ EXPECT_FALSE (clang_isTemplatedFunction (make_scope (Decls[3 ], I)));
566+ EXPECT_FALSE (clang_isTemplatedFunction (make_scope (SubDeclsC1[1 ], I)));
567+ EXPECT_TRUE (clang_isTemplatedFunction (make_scope (SubDeclsC1[2 ], I)));
568+ // Clean up resources
569+ clang_Interpreter_takeInterpreterAsPtr (I);
570+ clang_Interpreter_dispose (I);
527571}
528572
529573TEST (FunctionReflectionTest, ExistsFunctionTemplate) {
@@ -544,6 +588,14 @@ TEST(FunctionReflectionTest, ExistsFunctionTemplate) {
544588 EXPECT_TRUE (Cpp::ExistsFunctionTemplate (" f" , 0 ));
545589 EXPECT_TRUE (Cpp::ExistsFunctionTemplate (" f" , Decls[1 ]));
546590 EXPECT_FALSE (Cpp::ExistsFunctionTemplate (" f" , Decls[2 ]));
591+
592+ // C API
593+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
594+ EXPECT_TRUE (clang_existsFunctionTemplate (" f" , make_scope (Decls[1 ], I)));
595+ EXPECT_FALSE (clang_existsFunctionTemplate (" f" , make_scope (Decls[2 ], I)));
596+ // Clean up resources
597+ clang_Interpreter_takeInterpreterAsPtr (I);
598+ clang_Interpreter_dispose (I);
547599}
548600
549601TEST (FunctionReflectionTest, InstantiateTemplateFunctionFromString) {
@@ -1122,6 +1174,17 @@ TEST(FunctionReflectionTest, JitCallAdvanced) {
11221174 EXPECT_TRUE (object) << " Failed to call the ctor." ;
11231175 // Building a wrapper with a typedef decl must be possible.
11241176 Cpp::Destruct (object, Decls[1 ]);
1177+
1178+ // C API
1179+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
1180+ auto S = clang_getDefaultConstructor (make_scope (Decls[0 ], I));
1181+ void * object_c = nullptr ;
1182+ clang_invoke (S, &object_c, nullptr , 0 , nullptr );
1183+ EXPECT_TRUE (object_c) << " Failed to call the ctor." ;
1184+ clang_destruct (object_c, make_scope (Decls[1 ], I), true );
1185+ // Clean up resources
1186+ clang_Interpreter_takeInterpreterAsPtr (I);
1187+ clang_Interpreter_dispose (I);
11251188}
11261189
11271190
@@ -1476,6 +1539,23 @@ TEST(FunctionReflectionTest, Construct) {
14761539 Cpp::Deallocate (scope, where);
14771540 output = testing::internal::GetCapturedStdout ();
14781541 EXPECT_EQ (output, " Constructor Executed" );
1542+ output.clear ();
1543+
1544+ // C API
1545+ testing::internal::CaptureStdout ();
1546+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
1547+ auto scope_c = make_scope (static_cast <clang::Decl*>(scope), I);
1548+ auto object_c = clang_construct (scope_c, nullptr );
1549+ EXPECT_TRUE (object_c != nullptr );
1550+ output = testing::internal::GetCapturedStdout ();
1551+ EXPECT_EQ (output, " Constructor Executed" );
1552+ output.clear ();
1553+ auto dummy = clang_allocate (8 );
1554+ EXPECT_TRUE (dummy);
1555+ clang_deallocate (dummy);
1556+ // Clean up resources
1557+ clang_Interpreter_takeInterpreterAsPtr (I);
1558+ clang_Interpreter_dispose (I);
14791559}
14801560
14811561TEST (FunctionReflectionTest, Destruct) {
@@ -1519,4 +1599,17 @@ TEST(FunctionReflectionTest, Destruct) {
15191599 Cpp::Deallocate (scope, object);
15201600 output = testing::internal::GetCapturedStdout ();
15211601 EXPECT_EQ (output, " Destructor Executed" );
1602+
1603+ // C API
1604+ testing::internal::CaptureStdout ();
1605+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
1606+ auto scope_c = make_scope (static_cast <clang::Decl*>(scope), I);
1607+ auto object_c = clang_construct (scope_c, nullptr );
1608+ clang_destruct (object_c, scope_c, true );
1609+ output = testing::internal::GetCapturedStdout ();
1610+ EXPECT_EQ (output, " Destructor Executed" );
1611+ output.clear ();
1612+ // Clean up resources
1613+ clang_Interpreter_takeInterpreterAsPtr (I);
1614+ clang_Interpreter_dispose (I);
15221615}
0 commit comments