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) {
@@ -509,6 +542,17 @@ TEST(FunctionReflectionTest, IsTemplatedFunction) {
509542 EXPECT_FALSE (Cpp::IsTemplatedFunction (Decls[3 ]));
510543 EXPECT_FALSE (Cpp::IsTemplatedFunction (SubDeclsC1[1 ]));
511544 EXPECT_TRUE (Cpp::IsTemplatedFunction (SubDeclsC1[2 ]));
545+
546+ // C API
547+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
548+ EXPECT_FALSE (clang_isTemplatedFunction (make_scope (Decls[0 ], I)));
549+ EXPECT_TRUE (clang_isTemplatedFunction (make_scope (Decls[1 ], I)));
550+ EXPECT_FALSE (clang_isTemplatedFunction (make_scope (Decls[3 ], I)));
551+ EXPECT_FALSE (clang_isTemplatedFunction (make_scope (SubDeclsC1[1 ], I)));
552+ EXPECT_TRUE (clang_isTemplatedFunction (make_scope (SubDeclsC1[2 ], I)));
553+ // Clean up resources
554+ clang_Interpreter_takeInterpreterAsPtr (I);
555+ clang_Interpreter_dispose (I);
512556}
513557
514558TEST (FunctionReflectionTest, ExistsFunctionTemplate) {
@@ -529,6 +573,14 @@ TEST(FunctionReflectionTest, ExistsFunctionTemplate) {
529573 EXPECT_TRUE (Cpp::ExistsFunctionTemplate (" f" , 0 ));
530574 EXPECT_TRUE (Cpp::ExistsFunctionTemplate (" f" , Decls[1 ]));
531575 EXPECT_FALSE (Cpp::ExistsFunctionTemplate (" f" , Decls[2 ]));
576+
577+ // C API
578+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
579+ EXPECT_TRUE (clang_existsFunctionTemplate (" f" , make_scope (Decls[1 ], I)));
580+ EXPECT_FALSE (clang_existsFunctionTemplate (" f" , make_scope (Decls[2 ], I)));
581+ // Clean up resources
582+ clang_Interpreter_takeInterpreterAsPtr (I);
583+ clang_Interpreter_dispose (I);
532584}
533585
534586TEST (FunctionReflectionTest, InstantiateTemplateFunctionFromString) {
@@ -862,6 +914,17 @@ TEST(FunctionReflectionTest, JitCallAdvanced) {
862914 EXPECT_TRUE (object) << " Failed to call the ctor." ;
863915 // Building a wrapper with a typedef decl must be possible.
864916 Cpp::Destruct (object, Decls[1 ]);
917+
918+ // C API
919+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
920+ auto S = clang_getDefaultConstructor (make_scope (Decls[0 ], I));
921+ void * object_c = nullptr ;
922+ clang_invoke (S, &object_c, nullptr , 0 , nullptr );
923+ EXPECT_TRUE (object_c) << " Failed to call the ctor." ;
924+ clang_destruct (object_c, make_scope (Decls[1 ], I), true );
925+ // Clean up resources
926+ clang_Interpreter_takeInterpreterAsPtr (I);
927+ clang_Interpreter_dispose (I);
865928}
866929
867930
@@ -1210,6 +1273,23 @@ TEST(FunctionReflectionTest, Construct) {
12101273 Cpp::Deallocate (scope, where);
12111274 output = testing::internal::GetCapturedStdout ();
12121275 EXPECT_EQ (output, " Constructor Executed" );
1276+ output.clear ();
1277+
1278+ // C API
1279+ testing::internal::CaptureStdout ();
1280+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
1281+ auto scope_c = make_scope (static_cast <clang::Decl*>(scope), I);
1282+ auto object_c = clang_construct (scope_c, nullptr );
1283+ EXPECT_TRUE (object_c != nullptr );
1284+ output = testing::internal::GetCapturedStdout ();
1285+ EXPECT_EQ (output, " Constructor Executed" );
1286+ output.clear ();
1287+ auto dummy = clang_allocate (8 );
1288+ EXPECT_TRUE (dummy);
1289+ clang_deallocate (dummy);
1290+ // Clean up resources
1291+ clang_Interpreter_takeInterpreterAsPtr (I);
1292+ clang_Interpreter_dispose (I);
12131293}
12141294
12151295TEST (FunctionReflectionTest, Destruct) {
@@ -1250,4 +1330,17 @@ TEST(FunctionReflectionTest, Destruct) {
12501330 Cpp::Deallocate (scope, object);
12511331 output = testing::internal::GetCapturedStdout ();
12521332 EXPECT_EQ (output, " Destructor Executed" );
1333+
1334+ // C API
1335+ testing::internal::CaptureStdout ();
1336+ auto * I = clang_createInterpreterFromRawPtr (Cpp::GetInterpreter ());
1337+ auto scope_c = make_scope (static_cast <clang::Decl*>(scope), I);
1338+ auto object_c = clang_construct (scope_c, nullptr );
1339+ clang_destruct (object_c, scope_c, true );
1340+ output = testing::internal::GetCapturedStdout ();
1341+ EXPECT_EQ (output, " Destructor Executed" );
1342+ output.clear ();
1343+ // Clean up resources
1344+ clang_Interpreter_takeInterpreterAsPtr (I);
1345+ clang_Interpreter_dispose (I);
12531346}
0 commit comments