FIX: Error Using Inline Assembly in a Template Class

ID: Q136594


The information in this article applies to:
  • Microsoft C/C++ Compiler (CL.EXE), used with:
    • Microsoft Visual C++ 32-bit Edition, versions 2.0, 2.1, 2.2


SYMPTOMS

If inline assembly is used in an inline member function defined within a templated class, the compiler generates these errors:

If the assembly instruction is of the form _asm { int 3 }:


       error C2304: '<template class instance> }' : unexpected tokens
                                                    following type
       fatal error C1004: unexpected end of file found. 
If the assembly instruction is of the form _asm int 3:

       fatal error C1075: end of file found before the left <Unknown>
                          at <filename line number> was matched. 
The type of error depends on whether the assembly instruction is enclosed in braces or not.

NOTE: The same error occurs for macros like ASSERT and VERIFY, which expand to an _asm {int 3} instruction.


RESOLUTION

Define the member function outside the templated class using the "inline" keyword.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug was corrected in Microsoft Visual C++, 32-bit Edition, version 4.0.


MORE INFORMATION

Sample Code to Reproduce Problem


/* Compile options needed: /Ob1 or /Ob2 for the workaround function
/*                                      to be inline
*/ 

template <class type>
class myclass
{
 public:
   void good_fun();
   void bad_fun() {
   _asm {int 3}      // This generates a compiler error.
   }
};

template <class type>
inline void myclass<type>::good_fun() {
   _asm {int 3}      // This doesn't generate an error.
}

void main(void) {
   myclass<int> foo;
} 
In this code, the good_fun() compiles without any error.

Additional query words: 2.00 2.10 2.20 9.00 9.10

Keywords : kbCompiler kbCPPonly kbVC
Version : :2.0,2.1,2.2
Platform : NT WINDOWS
Issue type :


Last Reviewed: January 20, 2000
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.