[cfe-dev] CXXRecordDecl::getNumBases() in matcher asserts under certain conditions

Jason Murray via cfe-dev cfe-dev at lists.llvm.org
Sun Jul 31 14:00:08 PDT 2016


I suppose that's why it's called CXXRecordDecl, not CXXRecordDef. Thank you!
-Jason

On Fri, Jul 29, 2016 at 6:53 AM Adam McLaughlin <adam27x at gmail.com> wrote:

> Hi Jason,
>
> Do you care about the distinction between class declarations and class
> definitions? If not, the following matcher should suffice:
>
> DeclarationMatcher CLASS_MATCHER
>     = cxxRecordDecl(
>        isDefinition(),
>
>         unless(isTemplateInstantiation()),
>         hasAncestor(
>             namespaceDecl(hasName("test"))
>         )
>       ).bind("class");
>
>
> Similarly, in the code that handles the matcher you could check if the
> result is a definition. This latter approach is useful if you do care about
> this distinction.
>
> -Adam
>
> On Thu, Jul 28, 2016 at 6:11 PM, Jason Murray via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> Hey all,
>>
>> I've been working with AST Matchers with minimal issues for a while
>> now, but I recently started running into issues when querying matched
>> CXXRecordDecls for information about their base classes.
>>
>> Here's a repro repo: https://github.com/nopppers/clang-bases-bug
>>
>> Given the following matcher,
>>
>> DeclarationMatcher CLASS_MATCHER
>>     = cxxRecordDecl(
>>         unless(isTemplateInstantiation()),
>>         hasAncestor(
>>             namespaceDecl(hasName("test"))
>>         )
>>       ).bind("class");
>>
>> Calling CXXRecordDecl::getNumBases() or other base-class-related
>> functions like bases_begin() on the result of the matcher will
>> sometimes hit an assert. The debug message in the assert is
>> "queried property of class with no definition"
>>
>> The first condition under which the assert will trigger is when the
>> matcher callback recieves the CXXRecordDecl for the implicit
>> self-reference that the class has. For example, if the matcher is run
>> on the following code:
>>
>> namespace test
>> {
>> class Foo {};
>> }
>>
>> The call to getNumBases() will succeed for the first match, test::Foo,
>> and assert for the match test::Foo::Foo.
>>
>> To circumvent this, I've tried testing for
>> CXXRecordDecl::isImplicit(), which works around the assert properly.
>> There is, however, a second situation where the assert is triggered
>> that I don't understand.
>>
>> Running the matcher on the following code
>>
>> namespace test
>> {
>>     template <typename T>
>>     class DummyTemplate{};
>>
>>     class Dummy
>>     {
>>     public:
>>         // DummyTemplate<int> uncommentMeAndTheAssertWontTrigger;
>>     };
>>
>>     extern DummyTemplate<int> triggersAssertIfAboveIsCommentedOut;
>> }
>>
>> Results in the same assert, but only if the variable declaration in
>> the class is commented out.
>> Adding a classTemplateSpecialization matcher reveals some more info:
>>
>> Output with class var decl commented out:
>>
>> Found CXXRecordDecl
>> NumBases for test::DummyTemplate: 0
>> End.
>> Found CXXRecordDecl
>> NumBases for test::DummyTemplate: Assertion failed: DD && "queried
>> property of class with no definition", file
>>
>> S:\programming\libraries\clang\llvm\tools\clang\include\clang/AST/DeclCXX.h,
>> line 595
>>
>> Output with var decl uncommented:
>>
>> Found CXXRecordDecl
>> NumBases for test::DummyTemplate: 0
>> End.
>> Found ClassTemplateSpecializationDecl
>> NumBases for test::DummyTemplate: 0
>> End.
>> Found CXXRecordDecl
>> NumBases for test::Dummy: 0
>> End.
>>
>> So what is one to do? I'm unsure whether hitting the assert is
>> intentional in either case. If it is, how can I avoid hitting it in
>> the second case?
>>
>> Repro link again: https://github.com/nopppers/clang-bases-bug
>>
>> Regards,
>> Jason Powers Murray
>>
> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160731/d6cc499a/attachment.html>


More information about the cfe-dev mailing list