2017-07-17 104 views
0

我正在寫一個LLVM傳遞函數,以重新命名函數。我有這樣一小段代碼爲什麼這種類型的別名會導致編譯錯誤(C++)?

// Get function arguments 
std::vector<Argument*> Arguments; 
for (auto Arg = F.arg_begin(); Arg != F.arg_end(); ++Arg) 
{ 
    Type *ArgTy = Arg->getType(); 

    if (ArgTy->isFloatingPointTy()) 
    { 
    errs() << "Cannot test function: " << F.getName() << " (floating point arguments)\n"; 
    return false; 
    } 
    Arguments.push_back(Arg); 
} 

Arguments.push_back(Arg)導致一個編譯錯誤:

no known conversion for argument 1 from ‘llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Argument, false, false, void>, false, false>’ to ‘llvm::Argument* const&’

然而,在頭文件llvm/IR/Function.hsource),arg_iterator被聲明爲類型Argument *的別名,由Function實例調用的函數arg_begin()arg_end(),返回arg_iterator()類型。那麼,爲什麼我會得到類型錯誤?它是否與使用關鍵字auto有關?

+0

你*知道如何使用迭代器?當你(例如)*解引用*迭代器時得到什麼? –

+2

@Someprogrammerdude當迭代器的類型爲'Argument *'時,你得到指向的'Argument'作爲左值。但問題是爲什麼'auto Arg = F.arg_begin()'的類型不是在頭部聲明的'arg_iterator'(=='Argument *'),而是別的。 UnchartedWaters:創建一個[mcve]。你的例子不完整。 – user2079303

回答

0

嘗試取消引用您的迭代器:

std::vector<Argument*> Arguments; 
for (auto Arg = F.arg_begin(); Arg != F.arg_end(); ++Arg) 
{ 
    auto *ArgTy = Arg->getType(); 

    if (ArgTy->isFloatingPointTy()) 
    { 
    errs() << "Cannot test function: " << F.getName() << " (floating point arguments)\n"; 
    return false; 
    } 
    Arguments.push_back(*Arg); 
} 

若F專賣店對象,如Argument*

1

選中你正在使用您的驅動器上的文件的版本這隻會工作。如果您沒有直接從GitHub使用它,但是可能您的文件以LLVM安裝方式進行了某種操作,請檢查您正在構建的實際文件。

在GitHub上顯示「怪」,即有一個在arg_begin/arg_end返回類型從ArgumentListType::iteratorArgument *大約4個月前的變化(commit),所以你可能會建立針對舊版本,仍然有最初的複雜迭代器類型。

0

爲了防止編譯錯誤,儘可能解決方案如下

// Get function arguments 
std::vector<Argument*> Arguments; 
for (auto Arg = F.arg_begin(); Arg != F.arg_end(); ++Arg) 
{ 
    Type *ArgTy = Arg->getType(); 

    if (ArgTy->isFloatingPointTy()) 
    { 
    errs() << "Cannot test function: " << F.getName() << " (floating point arguments)\n"; 
    return false; 
    } 
    // Grab a pointer to the argument reference 
    Argument *ArgPtr = &*Arg; 
    Arguments.push_back(ArgPtr); 
} 

我的問題從我的指針誤解VS出現在C++(見here瞭解更多細節)引用。

我不確定爲什麼arg_iterator != Argument *在編譯時 - 它是 也許是因爲某些LLVM的特定功能。在任何情況下,我們需要取消Arg以獲得Argument類型,然後取Argument類型的地址(使用&運算符),以便獲得指向此類型的指針Argument

+0

我認爲你的困惑是在迭代器和指針之間,而不是引用和指針 – Useless

+0

代碼也應該在原始版本中工作,但只有當'arg_begin'返回類型實際上是'Argument *'時,也就是說,如果您使用的是最近版本從GitHub版本 - 有一個變化,看到我的答案。 – axalis

相關問題