<br><br>On Sunday, September 16, 2012, Sean Silva  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Maybe we should add LLVM_OVERRIDE to our C++11-prep arsenal? This<br>

really isn't what the `virtual` keyword is meant for...<br>
<br>
--Sean Silva<br>
<br>
On Sun, Sep 16, 2012 at 3:39 AM, Craig Topper <<a href="javascript:;" onclick="_e(event, 'cvml', 'craig.topper@gmail.com')">craig.topper@gmail.com</a>> wrote:<br>
> Author: ctopper<br>
> Date: Sun Sep 16 02:39:55 2012<br>
> New Revision: 163996<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=163996&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=163996&view=rev</a><br>
> Log:<br>
> Add explicit virtual keywords for methods that override base class.<br>
><br>
> Modified:<br>
>     llvm/trunk/include/llvm/TableGen/Record.h<br>
><br>
> Modified: llvm/trunk/include/llvm/TableGen/Record.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TableGen/Record.h?rev=163996&r1=163995&r2=163996&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/TableGen/Record.h?rev=163996&r1=163995&r2=163996&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/include/llvm/TableGen/Record.h (original)<br>
> +++ llvm/trunk/include/llvm/TableGen/Record.h Sun Sep 16 02:39:55 2012<br>
> @@ -152,9 +152,9 @@<br>
>    virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}<br>
>    virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}<br>
><br>
> -  std::string getAsString() const { return "bit"; }<br>
> +  virtual std::string getAsString() const { return "bit"; }<br>
><br>
> -  bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
> +  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
>      return RHS->baseClassOf(this);<br>
>    }<br>
>    virtual bool baseClassOf(const BitRecTy    *RHS) const { return true; }<br>
> @@ -195,9 +195,9 @@<br>
>    virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}<br>
>    virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}<br>
><br>
> -  std::string getAsString() const;<br>
> +  virtual std::string getAsString() const;<br>
><br>
> -  bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
> +  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
>      return RHS->baseClassOf(this);<br>
>    }<br>
>    virtual bool baseClassOf(const BitRecTy    *RHS) const { return Size == 1; }<br>
> @@ -237,9 +237,9 @@<br>
>    virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}<br>
>    virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}<br>
><br>
> -  std::string getAsString() const { return "int"; }<br>
> +  virtual std::string getAsString() const { return "int"; }<br>
><br>
> -  bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
> +  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
>      return RHS->baseClassOf(this);<br>
>    }<br>
><br>
> @@ -278,9 +278,9 @@<br>
>    virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}<br>
>    virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}<br>
><br>
> -  std::string getAsString() const { return "string"; }<br>
> +  virtual std::string getAsString() const { return "string"; }<br>
><br>
> -  bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
> +  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
>      return RHS->baseClassOf(this);<br>
>    }<br>
><br>
> @@ -322,9 +322,9 @@<br>
>    virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}<br>
>    virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}<br>
><br>
> -  std::string getAsString() const;<br>
> +  virtual std::string getAsString() const;<br>
><br>
> -  bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
> +  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
>      return RHS->baseClassOf(this);<br>
>    }<br>
><br>
> @@ -363,9 +363,9 @@<br>
>    virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}<br>
>    virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}<br>
><br>
> -  std::string getAsString() const { return "dag"; }<br>
> +  virtual std::string getAsString() const { return "dag"; }<br>
><br>
> -  bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
> +  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
>      return RHS->baseClassOf(this);<br>
>    }<br>
><br>
> @@ -407,9 +407,9 @@<br>
>    virtual Init *convertValue(   VarInit *VI) { return RecTy::convertValue(VI);}<br>
>    virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}<br>
><br>
> -  std::string getAsString() const;<br>
> +  virtual std::string getAsString() const;<br>
><br>
> -  bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
> +  virtual bool typeIsConvertibleTo(const RecTy *RHS) const {<br>
>      return RHS->baseClassOf(this);<br>
>    }<br>
>    virtual bool baseClassOf(const BitRecTy    *RHS) const { return false; }<br>
> @@ -758,7 +758,8 @@<br>
><br>
>    Record *getElementAsRecord(unsigned i) const;<br>
><br>
> -  Init *convertInitListSlice(const std::vector<unsigned> &Elements) const;<br>
> +  virtual Init *<br>
> +    convertInitListSlice(const std::vector<unsigned> &Elements) const;<br>
><br>
>    virtual Init *convertInitializerTo(RecTy *Ty) const {<br>
>      return Ty->convertValue(const_cast<ListInit *>(this));<br>
> @@ -849,8 +850,8 @@<br>
>      return UnOpInit::get(getOpcode(), *Operands.begin(), getType());<br>
>    }<br>
><br>
> -  int getNumOperands() const { return 1; }<br>
> -  Init *getOperand(int i) const {<br>
> +  virtual int getNumOperands() const { return 1; }<br>
> +  virtual Init *getOperand(int i) const {<br>
>      assert(i == 0 && "Invalid operand id for unary operator");<br>
>      return getOperand();<br>
>    }<br>
> @@ -860,7 +861,7 @@<br>
><br>
>    // Fold - If possible, fold this to a simpler init.  Return this if not<br>
>    // possible to fold.<br>
> -  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;<br>
> +  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;<br>
><br>
>    virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;<br>
><br>
> @@ -893,8 +894,8 @@<br>
>      return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType());<br>
>    }<br>
><br>
> -  int getNumOperands() const { return 2; }<br>
> -  Init *getOperand(int i) const {<br>
> +  virtual int getNumOperands() const { return 2; }<br>
> +  virtual Init *getOperand(int i) const {<br>
>      assert((i == 0 || i == 1) && "Invalid operand id for binary operator");<br>
>      if (i == 0) {<br>
>        return getLHS();<br>
> @@ -909,7 +910,7 @@<br>
><br>
>    // Fold - If possible, fold this to a simpler init.  Return this if not<br>
>    // possible to fold.<br>
> -  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;<br>
> +  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;<br>
><br>
>    virtual Init *resolveReferences(Record &R, const RecordVal *RV) const;<br>
><br>
> @@ -945,8 +946,8 @@<br>
>                             getType());<br>
>    }<br>
><br>
> -  int getNumOperands() const { return 3; }<br>
> -  Init *getOperand(int i) const {<br>
> +  virtual int getNumOperands() const { return 3; }<br>
> +  virtual Init *getOperand(int i) const {<br>
>      assert((i == 0 || i == 1 || i == 2) &&<br>
>             "Invalid operand id for ternary operator");<br>
>      if (i == 0) {<br>
> @@ -965,7 +966,7 @@<br>
><br>
>    // Fold - If possible, fold this to a simpler init.  Return this if not<br>
>    // possible to fold.<br>
> -  Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;<br>
> +  virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) const;<br>
><br>
>    virtual bool isComplete() const { return false; }<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="javascript:;" onclick="_e(event, 'cvml', 'llvm-commits@cs.uiuc.edu')">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote><br><br>-- <br>~Craig<br>