@@ -191,18 +191,20 @@ TEST(VariableReflectionTest, GetVariableType) {
191
191
EXPECT_EQ (Cpp::GetTypeAsString (Cpp::GetVariableType (Decls[8 ])), " int[4]" );
192
192
}
193
193
194
- #define CODE \
195
- int a; \
196
- const int N = 5 ; \
197
- class C { \
198
- public: \
199
- int a; \
200
- double b; \
201
- int *c; \
202
- int d; \
203
- static int s_a; \
204
- } c; \
205
- int C::s_a = 7 + N;
194
+ #define CODE \
195
+ int a; \
196
+ const int N = 5 ; \
197
+ static int S = N + 1 ; \
198
+ static const int SN = S + 1 ; \
199
+ class C { \
200
+ public: \
201
+ int a; \
202
+ double b; \
203
+ int * c; \
204
+ int d; \
205
+ static int s_a; \
206
+ } c; \
207
+ int C::s_a = 7 + SN;
206
208
207
209
CODE
208
210
@@ -215,11 +217,15 @@ TEST(VariableReflectionTest, GetVariableOffset) {
215
217
#undef Stringify
216
218
#undef CODE
217
219
220
+ EXPECT_EQ (7 , Decls.size ());
221
+
218
222
std::vector<Cpp::TCppScope_t> datamembers;
219
- Cpp::GetDatamembers (Decls[2 ], datamembers);
223
+ Cpp::GetDatamembers (Decls[4 ], datamembers);
220
224
221
225
EXPECT_TRUE ((bool ) Cpp::GetVariableOffset (Decls[0 ])); // a
222
226
EXPECT_TRUE ((bool ) Cpp::GetVariableOffset (Decls[1 ])); // N
227
+ EXPECT_TRUE ((bool )Cpp::GetVariableOffset (Decls[2 ])); // S
228
+ EXPECT_TRUE ((bool )Cpp::GetVariableOffset (Decls[3 ])); // SN
223
229
224
230
EXPECT_EQ (Cpp::GetVariableOffset (datamembers[0 ]), 0 );
225
231
@@ -230,7 +236,7 @@ TEST(VariableReflectionTest, GetVariableOffset) {
230
236
EXPECT_EQ (Cpp::GetVariableOffset (datamembers[3 ]),
231
237
((intptr_t ) &(c.d )) - ((intptr_t ) &(c.a )));
232
238
233
- auto * VD_C_s_a = Cpp::GetNamed (" s_a" , Decls[2 ]); // C::s_a
239
+ auto * VD_C_s_a = Cpp::GetNamed (" s_a" , Decls[4 ]); // C::s_a
234
240
EXPECT_TRUE ((bool ) Cpp::GetVariableOffset (VD_C_s_a));
235
241
}
236
242
@@ -355,3 +361,82 @@ TEST(VariableReflectionTest, DISABLED_GetArrayDimensions) {
355
361
// EXPECT_TRUE(is_vec_eq(Cpp::GetArrayDimensions(Decls[1]), {1}));
356
362
// EXPECT_TRUE(is_vec_eq(Cpp::GetArrayDimensions(Decls[2]), {1,2}));
357
363
}
364
+
365
+ TEST (VariableReflectionTest, StaticConstExprDatamember) {
366
+ if (llvm::sys::RunningOnValgrind ())
367
+ GTEST_SKIP () << " XFAIL due to Valgrind report" ;
368
+
369
+ #ifdef _WIN32
370
+ GTEST_SKIP () << " Disabled on Windows. Needs fixing." ;
371
+ #endif
372
+
373
+ Cpp::CreateInterpreter ();
374
+
375
+ Cpp::Declare (R"(
376
+ class MyClass {
377
+ public:
378
+ static constexpr int x = 3;
379
+ };
380
+
381
+ template<int i>
382
+ class MyTemplatedClass {
383
+ public:
384
+ static constexpr int x = i;
385
+ };
386
+
387
+ template<typename _Tp, _Tp __v>
388
+ struct integral_constant
389
+ {
390
+ static constexpr _Tp value = __v;
391
+ };
392
+
393
+ template<typename... Eles>
394
+ struct Elements
395
+ : public integral_constant<int, sizeof...(Eles)> {};
396
+ )" );
397
+
398
+ Cpp::TCppScope_t MyClass = Cpp::GetNamed (" MyClass" );
399
+ EXPECT_TRUE (MyClass);
400
+
401
+ std::vector<Cpp::TCppScope_t> datamembers;
402
+ Cpp::GetStaticDatamembers (MyClass, datamembers);
403
+ EXPECT_EQ (datamembers.size (), 1 );
404
+
405
+ intptr_t offset = Cpp::GetVariableOffset (datamembers[0 ]);
406
+ EXPECT_EQ (3 , *(int *)offset);
407
+
408
+ ASTContext& C = Interp->getCI ()->getASTContext ();
409
+ std::vector<Cpp::TemplateArgInfo> template_args = {
410
+ {C.IntTy .getAsOpaquePtr (), " 5" }};
411
+
412
+ Cpp::TCppFunction_t MyTemplatedClass =
413
+ Cpp::InstantiateTemplate (Cpp::GetNamed (" MyTemplatedClass" ),
414
+ template_args.data (), template_args.size ());
415
+ EXPECT_TRUE (MyTemplatedClass);
416
+
417
+ datamembers.clear ();
418
+ Cpp::GetStaticDatamembers (MyTemplatedClass, datamembers);
419
+ EXPECT_EQ (datamembers.size (), 1 );
420
+
421
+ offset = Cpp::GetVariableOffset (datamembers[0 ]);
422
+ EXPECT_EQ (5 , *(int *)offset);
423
+
424
+ std::vector<Cpp::TemplateArgInfo> ele_template_args = {
425
+ {C.IntTy .getAsOpaquePtr ()}, {C.FloatTy .getAsOpaquePtr ()}};
426
+
427
+ Cpp::TCppFunction_t Elements = Cpp::InstantiateTemplate (
428
+ Cpp::GetNamed (" Elements" ), ele_template_args.data (),
429
+ ele_template_args.size ());
430
+ EXPECT_TRUE (Elements);
431
+
432
+ EXPECT_EQ (1 , Cpp::GetNumBases (Elements));
433
+
434
+ Cpp::TCppScope_t IC = Cpp::GetBaseClass (Elements, 0 );
435
+
436
+ datamembers.clear ();
437
+ Cpp::GetStaticDatamembers (IC, datamembers);
438
+ EXPECT_EQ (datamembers.size (), 1 );
439
+
440
+ offset = Cpp::GetVariableOffset (datamembers[0 ]);
441
+ EXPECT_EQ (2 , *(int *)offset);
442
+ }
0 commit comments