FIX: Error Using Inline Assembly in a Template Class (136594)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Professional Edition 2.0
  • Microsoft Visual C++, 32-bit Professional Edition 2.1
  • Microsoft Visual C++, 32-bit Professional Edition 2.2

This article was previously published under Q136594

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> mytest;
}
				
In this code, the good_fun() compiles without any error.

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbbug kbCompiler kbCPPonly kbfix KB136594