Skip to content

Commit

Permalink
[clang-doc] Avoid parsing undefined base classes
Browse files Browse the repository at this point in the history
Don't try to parse base classes for declarations that are not
definitions (segfaults, as there is no DefinitionData to access).

Differential Revision: https://reviews.llvm.org/D52313

llvm-svn: 343703
  • Loading branch information
Julie Hockett committed Oct 3, 2018
1 parent ed9688d commit 73a4d54
Show file tree
Hide file tree
Showing 7 changed files with 406 additions and 344 deletions.
3 changes: 3 additions & 0 deletions clang-tools-extra/clang-doc/Serialize.cpp
Expand Up @@ -244,6 +244,9 @@ static void parseParameters(FunctionInfo &I, const FunctionDecl *D) {
}

static void parseBases(RecordInfo &I, const CXXRecordDecl *D) {
// Don't parse bases if this isn't a definition.
if (!D->isThisDeclarationADefinition())
return;
for (const CXXBaseSpecifier &B : D->bases()) {
if (B.isVirtual())
continue;
Expand Down
178 changes: 96 additions & 82 deletions clang-tools-extra/test/clang-doc/bc-record.cpp

Large diffs are not rendered by default.

142 changes: 78 additions & 64 deletions clang-tools-extra/test/clang-doc/mapper-record.cpp
Expand Up @@ -39,6 +39,8 @@ class X {
class Y {};
};

class G;

// RUN: clang-doc --dump-mapper --doxygen --extra-arg=-fmodules-ts -p %t %t/test.cpp -output=%t/docs


Expand Down Expand Up @@ -105,98 +107,110 @@ class X {
// CHECK-2-NEXT: </MemberTypeBlock>
// CHECK-2-NEXT: </RecordBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/641AB4A3D36399954ACDE29C7A8833032BF40472.bc | FileCheck %s --check-prefix CHECK-3
// RUN: llvm-bcanalyzer --dump %t/docs/bc/4202E8BF0ECB12AE354C8499C52725B0EE30AED5.bc | FileCheck %s --check-prefix CHECK-3
// CHECK-3: <BLOCKINFO_BLOCK/>
// CHECK-3-NEXT: <VersionBlock NumWords=1 BlockCodeSize=4>
// CHECK-3-NEXT: <Version abbrevid=4 op0=2/>
// CHECK-3-NEXT: </VersionBlock>
// CHECK-3-NEXT: <RecordBlock NumWords=24 BlockCodeSize=4>
// CHECK-3-NEXT: <RecordBlock NumWords=12 BlockCodeSize=4>
// CHECK-3-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-3-NEXT: <Name abbrevid=5 op0=1/> blob data = 'Y'
// CHECK-3-NEXT: <ReferenceBlock NumWords=10 BlockCodeSize=4>
// CHECK-3-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-3-NEXT: <Name abbrevid=5 op0=1/> blob data = 'X'
// CHECK-3-NEXT: <RefType abbrevid=6 op0=2/>
// CHECK-3-NEXT: <Field abbrevid=7 op0=1/>
// CHECK-3-NEXT: </ReferenceBlock>
// CHECK-3-NEXT: <DefLocation abbrevid=6 op0=39 op1=4/> blob data = '{{.*}}'
// CHECK-3-NEXT: <Name abbrevid=5 op0=1/> blob data = 'G'
// CHECK-3-NEXT: <Location abbrevid=7 op0=42 op1=4/> blob data = '{{.*}}'
// CHECK-3-NEXT: <TagType abbrevid=8 op0=3/>
// CHECK-3-NEXT: </RecordBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/0000000000000000000000000000000000000000.bc | FileCheck %s --check-prefix CHECK-4
// RUN: llvm-bcanalyzer --dump %t/docs/bc/641AB4A3D36399954ACDE29C7A8833032BF40472.bc | FileCheck %s --check-prefix CHECK-4
// CHECK-4: <BLOCKINFO_BLOCK/>
// CHECK-4-NEXT: <VersionBlock NumWords=1 BlockCodeSize=4>
// CHECK-4-NEXT: <Version abbrevid=4 op0=2/>
// CHECK-4-NEXT: </VersionBlock>
// CHECK-4-NEXT: <NamespaceBlock NumWords=19 BlockCodeSize=4>
// CHECK-4-NEXT: <EnumBlock NumWords=16 BlockCodeSize=4>
// CHECK-4-NEXT: <RecordBlock NumWords=24 BlockCodeSize=4>
// CHECK-4-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-4-NEXT: <Name abbrevid=5 op0=1/> blob data = 'Y'
// CHECK-4-NEXT: <ReferenceBlock NumWords=10 BlockCodeSize=4>
// CHECK-4-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-4-NEXT: <Name abbrevid=5 op0=2/> blob data = 'Bc'
// CHECK-4-NEXT: <DefLocation abbrevid=6 op0=19 op1=4/> blob data = '{{.*}}'
// CHECK-4-NEXT: <Scoped abbrevid=9 op0=1/>
// CHECK-4-NEXT: <Member abbrevid=8 op0=1/> blob data = 'A'
// CHECK-4-NEXT: <Member abbrevid=8 op0=1/> blob data = 'B'
// CHECK-4-NEXT: </EnumBlock>
// CHECK-4-NEXT: </NamespaceBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/0921737541208B8FA9BB42B60F78AC1D779AA054.bc | FileCheck %s --check-prefix CHECK-5
// CHECK-4-NEXT: <Name abbrevid=5 op0=1/> blob data = 'X'
// CHECK-4-NEXT: <RefType abbrevid=6 op0=2/>
// CHECK-4-NEXT: <Field abbrevid=7 op0=1/>
// CHECK-4-NEXT: </ReferenceBlock>
// CHECK-4-NEXT: <DefLocation abbrevid=6 op0=39 op1=4/> blob data = '{{.*}}'
// CHECK-4-NEXT: <TagType abbrevid=8 op0=3/>
// CHECK-4-NEXT: </RecordBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/0000000000000000000000000000000000000000.bc | FileCheck %s --check-prefix CHECK-5
// CHECK-5: <BLOCKINFO_BLOCK/>
// CHECK-5-NEXT: <VersionBlock NumWords=1 BlockCodeSize=4>
// CHECK-5-NEXT: <Version abbrevid=4 op0=2/>
// CHECK-5-NEXT: </VersionBlock>
// CHECK-5-NEXT: <RecordBlock NumWords=12 BlockCodeSize=4>
// CHECK-5-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-5-NEXT: <Name abbrevid=5 op0=1/> blob data = 'D'
// CHECK-5-NEXT: <DefLocation abbrevid=6 op0=23 op1=4/> blob data = '{{.*}}'
// CHECK-5-NEXT: <TagType abbrevid=8 op0=3/>
// CHECK-5-NEXT: </RecordBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/E3B54702FABFF4037025BA194FC27C47006330B5.bc | FileCheck %s --check-prefix CHECK-6
// CHECK-5-NEXT: <NamespaceBlock NumWords=19 BlockCodeSize=4>
// CHECK-5-NEXT: <EnumBlock NumWords=16 BlockCodeSize=4>
// CHECK-5-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-5-NEXT: <Name abbrevid=5 op0=2/> blob data = 'Bc'
// CHECK-5-NEXT: <DefLocation abbrevid=6 op0=19 op1=4/> blob data = '{{.*}}'
// CHECK-5-NEXT: <Scoped abbrevid=9 op0=1/>
// CHECK-5-NEXT: <Member abbrevid=8 op0=1/> blob data = 'A'
// CHECK-5-NEXT: <Member abbrevid=8 op0=1/> blob data = 'B'
// CHECK-5-NEXT: </EnumBlock>
// CHECK-5-NEXT: </NamespaceBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/0921737541208B8FA9BB42B60F78AC1D779AA054.bc | FileCheck %s --check-prefix CHECK-6
// CHECK-6: <BLOCKINFO_BLOCK/>
// CHECK-6-NEXT: <VersionBlock NumWords=1 BlockCodeSize=4>
// CHECK-6-NEXT: <Version abbrevid=4 op0=2/>
// CHECK-6-NEXT: </VersionBlock>
// CHECK-6-NEXT: <RecordBlock NumWords=37 BlockCodeSize=4>
// CHECK-6-NEXT: <RecordBlock NumWords=12 BlockCodeSize=4>
// CHECK-6-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-6-NEXT: <Name abbrevid=5 op0=1/> blob data = 'F'
// CHECK-6-NEXT: <DefLocation abbrevid=6 op0=36 op1=4/> blob data = '{{.*}}'
// CHECK-6-NEXT: <Name abbrevid=5 op0=1/> blob data = 'D'
// CHECK-6-NEXT: <DefLocation abbrevid=6 op0=23 op1=4/> blob data = '{{.*}}'
// CHECK-6-NEXT: <TagType abbrevid=8 op0=3/>
// CHECK-6-NEXT: <ReferenceBlock NumWords=10 BlockCodeSize=4>
// CHECK-6-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-6-NEXT: <Name abbrevid=5 op0=1/> blob data = 'E'
// CHECK-6-NEXT: <RefType abbrevid=6 op0=2/>
// CHECK-6-NEXT: <Field abbrevid=7 op0=2/>
// CHECK-6-NEXT: </ReferenceBlock>
// CHECK-6-NEXT: <ReferenceBlock NumWords=10 BlockCodeSize=4>
// CHECK-6-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-6-NEXT: <Name abbrevid=5 op0=1/> blob data = 'D'
// CHECK-6-NEXT: <RefType abbrevid=6 op0=2/>
// CHECK-6-NEXT: <Field abbrevid=7 op0=3/>
// CHECK-6-NEXT: </ReferenceBlock>
// CHECK-6-NEXT: </RecordBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/ACE81AFA6627B4CEF2B456FB6E1252925674AF7E.bc | FileCheck %s --check-prefix CHECK-7
// RUN: llvm-bcanalyzer --dump %t/docs/bc/E3B54702FABFF4037025BA194FC27C47006330B5.bc | FileCheck %s --check-prefix CHECK-7
// CHECK-7: <BLOCKINFO_BLOCK/>
// CHECK-7-NEXT: <VersionBlock NumWords=1 BlockCodeSize=4>
// CHECK-7-NEXT: <Version abbrevid=4 op0=2/>
// CHECK-7-NEXT: </VersionBlock>
// CHECK-7-NEXT: <RecordBlock NumWords=33 BlockCodeSize=4>
// CHECK-7-NEXT: <RecordBlock NumWords=37 BlockCodeSize=4>
// CHECK-7-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-7-NEXT: <Name abbrevid=5 op0=1/> blob data = 'A'
// CHECK-7-NEXT: <DefLocation abbrevid=6 op0=15 op1=4/> blob data = '{{.*}}'
// CHECK-7-NEXT: <TagType abbrevid=8 op0=2/>
// CHECK-7-NEXT: <MemberTypeBlock NumWords=8 BlockCodeSize=4>
// CHECK-7-NEXT: <ReferenceBlock NumWords=3 BlockCodeSize=4>
// CHECK-7-NEXT: <Name abbrevid=5 op0=3/> blob data = 'int'
// CHECK-7-NEXT: <Field abbrevid=7 op0=4/>
// CHECK-7-NEXT: </ReferenceBlock>
// CHECK-7-NEXT: <Name abbrevid=4 op0=1/> blob data = 'X'
// CHECK-7-NEXT: </MemberTypeBlock>
// CHECK-7-NEXT: <MemberTypeBlock NumWords=8 BlockCodeSize=4>
// CHECK-7-NEXT: <ReferenceBlock NumWords=3 BlockCodeSize=4>
// CHECK-7-NEXT: <Name abbrevid=5 op0=3/> blob data = 'int'
// CHECK-7-NEXT: <Field abbrevid=7 op0=4/>
// CHECK-7-NEXT: </ReferenceBlock>
// CHECK-7-NEXT: <Name abbrevid=4 op0=1/> blob data = 'Y'
// CHECK-7-NEXT: </MemberTypeBlock>
// CHECK-7-NEXT: <Name abbrevid=5 op0=1/> blob data = 'F'
// CHECK-7-NEXT: <DefLocation abbrevid=6 op0=36 op1=4/> blob data = '{{.*}}'
// CHECK-7-NEXT: <TagType abbrevid=8 op0=3/>
// CHECK-7-NEXT: <ReferenceBlock NumWords=10 BlockCodeSize=4>
// CHECK-7-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-7-NEXT: <Name abbrevid=5 op0=1/> blob data = 'E'
// CHECK-7-NEXT: <RefType abbrevid=6 op0=2/>
// CHECK-7-NEXT: <Field abbrevid=7 op0=2/>
// CHECK-7-NEXT: </ReferenceBlock>
// CHECK-7-NEXT: <ReferenceBlock NumWords=10 BlockCodeSize=4>
// CHECK-7-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-7-NEXT: <Name abbrevid=5 op0=1/> blob data = 'D'
// CHECK-7-NEXT: <RefType abbrevid=6 op0=2/>
// CHECK-7-NEXT: <Field abbrevid=7 op0=3/>
// CHECK-7-NEXT: </ReferenceBlock>
// CHECK-7-NEXT: </RecordBlock>

// RUN: llvm-bcanalyzer --dump %t/docs/bc/ACE81AFA6627B4CEF2B456FB6E1252925674AF7E.bc | FileCheck %s --check-prefix CHECK-8
// CHECK-8: <BLOCKINFO_BLOCK/>
// CHECK-8-NEXT: <VersionBlock NumWords=1 BlockCodeSize=4>
// CHECK-8-NEXT: <Version abbrevid=4 op0=2/>
// CHECK-8-NEXT: </VersionBlock>
// CHECK-8-NEXT: <RecordBlock NumWords=33 BlockCodeSize=4>
// CHECK-8-NEXT: <USR abbrevid=4 op0=20 op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}} op4={{[0-9]+}} op5={{[0-9]+}} op6={{[0-9]+}} op7={{[0-9]+}} op8={{[0-9]+}} op9={{[0-9]+}} op10={{[0-9]+}} op11={{[0-9]+}} op12={{[0-9]+}} op13={{[0-9]+}} op14={{[0-9]+}} op15={{[0-9]+}} op16={{[0-9]+}} op17={{[0-9]+}} op18={{[0-9]+}} op19={{[0-9]+}} op20={{[0-9]+}}/>
// CHECK-8-NEXT: <Name abbrevid=5 op0=1/> blob data = 'A'
// CHECK-8-NEXT: <DefLocation abbrevid=6 op0=15 op1=4/> blob data = '{{.*}}'
// CHECK-8-NEXT: <TagType abbrevid=8 op0=2/>
// CHECK-8-NEXT: <MemberTypeBlock NumWords=8 BlockCodeSize=4>
// CHECK-8-NEXT: <ReferenceBlock NumWords=3 BlockCodeSize=4>
// CHECK-8-NEXT: <Name abbrevid=5 op0=3/> blob data = 'int'
// CHECK-8-NEXT: <Field abbrevid=7 op0=4/>
// CHECK-8-NEXT: </ReferenceBlock>
// CHECK-8-NEXT: <Name abbrevid=4 op0=1/> blob data = 'X'
// CHECK-8-NEXT: </MemberTypeBlock>
// CHECK-8-NEXT: <MemberTypeBlock NumWords=8 BlockCodeSize=4>
// CHECK-8-NEXT: <ReferenceBlock NumWords=3 BlockCodeSize=4>
// CHECK-8-NEXT: <Name abbrevid=5 op0=3/> blob data = 'int'
// CHECK-8-NEXT: <Field abbrevid=7 op0=4/>
// CHECK-8-NEXT: </ReferenceBlock>
// CHECK-8-NEXT: <Name abbrevid=4 op0=1/> blob data = 'Y'
// CHECK-8-NEXT: </MemberTypeBlock>
// CHECK-8-NEXT: </RecordBlock>
5 changes: 5 additions & 0 deletions clang-tools-extra/test/clang-doc/md-record.cpp
Expand Up @@ -39,6 +39,8 @@ class X {
class Y {};
};

class G;

// RUN: clang-doc --format=md --doxygen --public --extra-arg=-fmodules-ts -p %t %t/test.cpp -output=%t/docs


Expand Down Expand Up @@ -95,3 +97,6 @@ class X {
// CHECK-6: ## Members
// CHECK-6: int X
// CHECK-6: int Y

// RUN: cat %t/docs/./G.md | FileCheck %s --check-prefix CHECK-7
// CHECK-7: # class G

0 comments on commit 73a4d54

Please sign in to comment.