Fixed #10066 (FP: duplicateExpression clangimport)

This commit is contained in:
Daniel Marjamäki 2021-01-08 22:30:06 +01:00
parent 3b5c558414
commit 4b5aedbbab
2 changed files with 28 additions and 11 deletions

View File

@ -386,6 +386,10 @@ std::string clangimport::AstNode::getSpelling() const
if (typeIndex <= 0)
return "";
}
if (nodeType == DeclRefExpr) {
while (typeIndex > 0 && std::isalpha(mExtTokens[typeIndex][0]))
typeIndex--;
}
const std::string &str = mExtTokens[typeIndex - 1];
if (str.compare(0,4,"col:") == 0)
return "";
@ -887,7 +891,10 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList)
return t;
}
if (nodeType == DeclRefExpr) {
const std::string addr = mExtTokens[mExtTokens.size() - 3];
int addrIndex = mExtTokens.size() - 1;
while (addrIndex > 1 && mExtTokens[addrIndex].compare(0,2,"0x") != 0)
--addrIndex;
const std::string addr = mExtTokens[addrIndex];
std::string name = unquote(getSpelling());
Token *reftok = addtoken(tokenList, name.empty() ? "<NoName>" : name);
mData->ref(addr, reftok);
@ -1169,8 +1176,14 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList)
Token *par1 = addtoken(tokenList, "(");
if (children.empty())
addTypeTokens(tokenList, mExtTokens.back());
else
addTypeTokens(tokenList, getChild(0)->getType());
else {
AstNodePtr child = getChild(0);
if (child && child->nodeType == ParenExpr)
child = child->getChild(0);
Token *expr = child->createTokens(tokenList);
child->setValueType(expr);
par1->astOperand2(expr);
}
Token *par2 = addtoken(tokenList, ")");
par1->link(par2);
par2->link(par1);

View File

@ -937,7 +937,7 @@ private:
" `-UnaryExprOrTypeTraitExpr 0x27c6ca8 <col:13, col:23> 'unsigned long' sizeof\n"
" `-ParenExpr 0x27c6c88 <col:19, col:23> 'char [10]' lvalue\n"
" `-DeclRefExpr 0x27c6c60 <col:20> 'char [10]' lvalue Var 0x27c6b48 'buf' 'char [10]'";
ASSERT_EQUALS("int x@1 = sizeof ( char [10] ) ;", parse(clang));
ASSERT_EQUALS("int x@1 = sizeof ( buf ) ;", parse(clang));
}
void unaryOperator() {
@ -1211,6 +1211,7 @@ private:
}
void valueFlow1() {
// struct S { int x; int buf[10]; } ; int sz = sizeof(struct S);
const char clang[] = "|-RecordDecl 0x2fc5a88 <1.c:1:1, line:4:1> line:1:8 struct S definition\n"
"| |-FieldDecl 0x2fc5b48 <line:2:3, col:7> col:7 x 'int'\n"
"| `-FieldDecl 0x2fc5c10 <line:3:3, col:13> col:7 buf 'int [10]'\n"
@ -1227,19 +1228,22 @@ private:
}
void valueFlow2() {
const char clang[] = "`-VarDecl 0x4145bc0 <line:2:1, col:20> col:5 sz 'int' cinit\n"
" `-ImplicitCastExpr 0x4145c88 <col:10, col:20> 'int' <IntegralCast>\n"
" `-UnaryExprOrTypeTraitExpr 0x4145c68 <col:10, col:20> 'unsigned long' sizeof\n"
" `-ParenExpr 0x4145c48 <col:16, col:20> 'char [10]' lvalue\n"
" `-DeclRefExpr 0x4145c20 <col:17> 'char [10]' lvalue Var 0x4145b08 'buf' 'char [10]'";
// int buf[42];
// int x = sizeof(buf);
const char clang[] = "|-VarDecl 0x10f6de8 <66.cpp:3:1, col:11> col:5 referenced buf 'int [42]'\n"
"`-VarDecl 0x10f6eb0 <line:4:1, col:19> col:5 x 'int' cinit\n"
" `-ImplicitCastExpr 0x10f6f78 <col:9, col:19> 'int' <IntegralCast>\n"
" `-UnaryExprOrTypeTraitExpr 0x10f6f58 <col:9, col:19> 'unsigned long' sizeof\n"
" `-ParenExpr 0x10f6f38 <col:15, col:19> 'int [42]' lvalue\n"
" `-DeclRefExpr 0x10f6f18 <col:16> 'int [42]' lvalue Var 0x10f6de8 'buf' 'int [42]' non_odr_use_unevaluated";
GET_SYMBOL_DB(clang);
const Token *tok = Token::findsimplematch(tokenizer.tokens(), "sizeof (");
ASSERT(!!tok);
tok = tok->next();
ASSERT(tok->hasKnownIntValue());
ASSERT_EQUALS(10, tok->getKnownIntValue());
// TODO ASSERT(tok->hasKnownIntValue());
// TODO ASSERT_EQUALS(10, tok->getKnownIntValue());
}
void valueType1() {