I have the following         situation with which I could use some enlightenment. As usual,         the context is TableGen.
      

    

in class Record:

    
      

public:
            using AssertionTuple = std::tuple;
          ...
            SmallVector Assertions;

    
    

then there exists:

    
      

  struct RecordsEntry {
              std::unique_ptr Rec;
              std::unique_ptr Loop;
              std::unique_ptr Assertion;
          
              void dump() const;
          
              RecordsEntry() {}
              RecordsEntry(std::unique_ptr Rec) :           Rec(std::move(Rec)) {}
              RecordsEntry(std::unique_ptr Loop)
                : Loop(std::move(Loop)) {}
              RecordsEntry(std::unique_ptr           Assertion) // 4th constructor
                : Assertion(std::move(Assertion)) {}
            };

      

...

      

bool TGParser::addEntry(RecordsEntry E) { ...
        

    
    

Note that I expect to create a RecordsEntry by passing an       AssertionTuple to addEntry and having the 4th constructor do the       trick. The other three constructors all work fine. However, when I       do this:

    
      

    Record::AssertionTuple tuple =           std::make_tuple(ConditionLoc, Condition, Message);
              addEntry(std::move(tuple));
        

    
    

I get this:

    
      

C:\LLVM\llvm-project\llvm\lib\TableGen\TGParser.cpp(3190):           error C2664: 'bool           llvm::TGParser::addEntry(llvm::RecordsEntry)': cannot convert           argument 1 from 'llvm::Record::AssertionTuple' to           'llvm::RecordsEntry'
          C:\LLVM\llvm-project\llvm\lib\TableGen\TGParser.cpp(3190):           note: No user-defined-conversion operator available that can           perform this conversion, or the operator cannot be called
          C:\LLVM\llvm-project\llvm\lib\TableGen\TGParser.cpp(344):           note: see declaration of 'llvm::TGParser::addEntry'
        

    
    

Ah, I guess I should show the definitions of the three arguments       passed to make_tuple() above:

    
      

  SMLoc ConditionLoc = Lex.getLoc();
            Init *Condition = ParseValue(CurRec);
            Init *Message = ParseValue(CurRec);

    
    

 Since there is no complaint about making the tuple, I assume       those three arguments have the correct type. The problem is the       4th RecordsEntry constructor, which cannot convert the addEntry       argument 'std::move(tuple)' to a Record::AssertionTuple, even       though that's exactly what it is.

    

P.S.: Regardless of what I learn here, I'm going to change the       assertion tuple into a little struct, which should work fine as       demonstrated by constructor 3 above.
    

           
                        ">

(original) (raw)

I have the following situation with which I could use some enlightenment. As usual, the context is TableGen.

in class Record:

public:
using AssertionTuple = std::tuple;
...
SmallVector Assertions;

then there exists:

struct RecordsEntry {
std::unique\_ptr Rec;
std::unique\_ptr Loop;
std::unique\_ptr Assertion;

void dump() const;

RecordsEntry() {}
RecordsEntry(std::unique\_ptr Rec) : Rec(std::move(Rec)) {}
RecordsEntry(std::unique\_ptr Loop)
: Loop(std::move(Loop)) {}
RecordsEntry(std::unique\_ptr Assertion) // 4th constructor
: Assertion(std::move(Assertion)) {}
};

...

bool TGParser::addEntry(RecordsEntry E) { ...

Note that I expect to create a RecordsEntry by passing an AssertionTuple to addEntry and having the 4th constructor do the trick. The other three constructors all work fine. However, when I do this:

Record::AssertionTuple tuple = std::make\_tuple(ConditionLoc, Condition, Message);
addEntry(std::move(tuple));

I get this:

C:\\LLVM\\llvm-project\\llvm\\lib\\TableGen\\TGParser.cpp(3190): error C2664: 'bool llvm::TGParser::addEntry(llvm::RecordsEntry)': cannot convert argument 1 from 'llvm::Record::AssertionTuple' to 'llvm::RecordsEntry'
C:\\LLVM\\llvm-project\\llvm\\lib\\TableGen\\TGParser.cpp(3190): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
C:\\LLVM\\llvm-project\\llvm\\lib\\TableGen\\TGParser.cpp(344): note: see declaration of 'llvm::TGParser::addEntry'

Ah, I guess I should show the definitions of the three arguments passed to make\_tuple() above:

SMLoc ConditionLoc = Lex.getLoc();
Init \*Condition = ParseValue(CurRec);
Init \*Message = ParseValue(CurRec);

Since there is no complaint about making the tuple, I assume those three arguments have the correct type. The problem is the 4th RecordsEntry constructor, which cannot convert the addEntry argument 'std::move(tuple)' to a Record::AssertionTuple, even though that's exactly what it is.

P.S.: Regardless of what I learn here, I'm going to change the assertion tuple into a little struct, which should work fine as demonstrated by constructor 3 above.