Re: [CEDET-devel] Bug in semantic-c.el with define-mode-local-override definitions
Brought to you by:
zappo
From: David P. <dav...@wa...> - 2004-09-08 13:00:18
|
Klaus, > ok, point is taken - means seems no bug with defining the overload for > c-mode... Good ;-) > But nevertheless something doesn't work: > > here is what is done by semantic-tag-abstract-p-c-mode: > > ((eq (semantic-tag-class tag) 'function) > (semantic-tag-get-attribute tag :pure-virtual-flag)) > > Ok, when i put point onto the virtual method "aProctedMethod" > (line 8 in the following short c++-header-file klaus-test.hpp) then > (semantic-tag-attributes (semantic-current-tag)) returns > > (:prototype-flag t :typemodifiers ("virtual") :type "void") > > You see, there is no attribute :pure-virtual-flag contained in > the plist! So no one can be found and therefore in turn the > abstract-p check fails... I didn't received your klaus-test.hpp sample. Anyway it looks you're probably right. The :pure-virtual-flag is provided by the c.by grammar rule: fun-or-proto-end : SEMICOLON ( t ) | semantic-list ( nil ) ;; Here is an anoying feature of C++ pure virtual methods | EQUAL ZERO SEMICOLON ( :pure-virtual-flag ) ; which seems to check that the function declaration ends with "= 0;" to consider it as pure virtual, which looks good for me. IMO, the problem is in the C override of `semantic-tag-abstract-p' which doesn't check the virtual modifiers for functions. Probably it should be modified like this: Index: semantic-c.el =================================================================== RCS file: /cvsroot/cedet/cedet/semantic/bovine/semantic-c.el,v retrieving revision 1.34 diff -c -r1.34 semantic-c.el *** semantic-c.el 23 Jul 2004 18:37:33 -0000 1.34 --- semantic-c.el 8 Sep 2004 12:54:56 -0000 *************** *** 500,506 **** ) ))) ((eq (semantic-tag-class tag) 'function) ! (semantic-tag-get-attribute tag :pure-virtual-flag)) (t (semantic-tag-abstract-p-default tag parent)))) (define-mode-local-override semantic-analyze-dereference-metatype --- 500,507 ---- ) ))) ((eq (semantic-tag-class tag) 'function) ! (or (semantic-tag-get-attribute tag :pure-virtual-flag) ! (member "virtual" (semantic-tag-modifiers tag)))) (t (semantic-tag-abstract-p-default tag parent)))) (define-mode-local-override semantic-analyze-dereference-metatype If it looks good for you (I am not a C/C++ guru), I will commit the change. Thanks for your sharp eyesight! David |