Hi.

I check out from CVS, and your fix can work very well, thank you!

If you find the better solution, please let me know, I'd like to use the "perfect" solution.

2010/1/18 Eric M. Ludlam <eric@siege-engine.com>
I've checked in a "fix" that just puts a recursion limit into the macro expansion.  This should solve your problem.  I'll need to find a better solution that doesn't need this limit though.

Enjoy
Eric

peng yu wrote:
Hi.

In fact, the #define is not used by the structure snd_device_ops,  the snd_device in the struture is be defined in some other place.

This code is a part of alsa (advanture linux sound driver, an open source project).

Now I am working on write a sound driver in linux, and I setup a ede-cpp-root-project on my code, then I use semantic-ia-fast-jump to browse my code. I find sometimes I loss the respond of emacs when I run the semantic-ia-fast-jump command, so I extract my code to find which part of code cause this problem, at last, I get the code I sent to you in test1.c. This piece of code is not written by me, I don't know why the author write the code in this from too, but if you can fix this problem, it will be very helpful for me.

BR.
yupeng.

2010/1/17 Eric M. Ludlam <eric@siege-engine.com <mailto:eric@siege-engine.com>>


   Hi,

   I see the problem, but can you explain this C code?

   The issue is that snd_device is #defined after it is used in the
   structure, and the use in the structure doesn't have enough
   arguments, and that's making CEDET a bit cranky.

   Is it supposed to be defined in that order?  Is snd_device also a
   non-macro somewhere else?

   I'll try to fix the hang, but I'd like to understand how the code is
   supposed to work too.

   Thanks
   Eric


   yupeng wrote:

       this is a c program file test1.c:
       --------------------------------------------------------------------------
       struct snd_device_ops {
              int (*dev_disconnect)(struct snd_device *dev);
       };

       #define snd_device(n) list_entry(n, struct snd_device, list)

       int my_variable;

       void snd_power_lock( void )
       {
          my_variable = 0;
       }