demangle.go
func (st *state) baseUnresolvedName() AST {
	var n AST
	if len(st.str) >= 2 && st.str[:2] == "on" {
		st.advance(2)
		n, _ = st.operatorName(true)
	} else if len(st.str) >= 2 && st.str[:2] == "dn" {
		st.advance(2)
		if len(st.str) > 0 && isDigit(st.str[0]) {
			n = st.sourceName()
		} else {
			n = st.demangleType(false)
		}
		n = &Destructor{Name: n}
	} else if len(st.str) > 0 && isDigit(st.str[0]) {
		n = st.sourceName()
	} else {
		// GCC seems to not follow the ABI here: it can have
		// an operator name without on.
		// See https://gcc.gnu.org/PR70182.
		n, _ = st.operatorName(true)
	}
	if len(st.str) > 0 && st.str[0] == 'I' {
		args := st.templateArgs()
		n = &Template{Name: n, Args: args}
	}
	return n
}
func (st *state) baseUnresolvedName() AST {
	var n AST
	if len(st.str) >= 2 && st.str[:2] == "on" {
		st.advance(2)
		n, _ = st.operatorName(true)
	} else if len(st.str) >= 2 && st.str[:2] == "dn" {
		st.advance(2)
		if len(st.str) > 0 && isDigit(st.str[0]) {
			n = st.sourceName()
		} else {
			n = st.demangleType(false)
		}
		n = &Destructor{Name: n}
	} else if len(st.str) > 0 && isDigit(st.str[0]) {
		n = st.sourceName()
	} else {
		// GCC seems to not follow the ABI here: it can have
		// an operator name without on.
		// See https://gcc.gnu.org/PR70182.
		n, _ = st.operatorName(true)
	}
	if len(st.str) > 0 && st.str[0] == 'I' {
		args := st.templateArgs()
		n = &Template{Name: n, Args: args}
	}
	return n
}
func ( st * state ) baseUnresolvedName ( ) AST { var n AST if len ( st . str ) >= 2 && st . str [ : 2 ] == " " { st . advance ( 2 ) n , _ = st . operatorName ( true ) } else if len ( st . str ) >= 2 && st . str [ : 2 ] == " " { st . advance ( 2 ) if len ( st . str ) > 0 && isDigit ( st . str [ 0 ] ) { n = st . sourceName ( ) } else { n = st . demangleType ( false ) } n = & Destructor { Name : n } } else if len ( st . str ) > 0 && isDigit ( st . str [ 0 ] ) { n = st . sourceName ( ) } else { // GCC seems to not follow the ABI here: it can have // an operator name without on. // See https://gcc.gnu.org/PR70182. n , _ = st . operatorName ( true ) } if len ( st . str ) > 0 && st . str [ 0 ] == 'I' { args := st . templateArgs ( ) n = & Template { Name : n , Args : args } } return n }
// <base-unresolved-name> ::= <simple-id>
//                        ::= on <operator-name>
//                        ::= on <operator-name> <template-args>
//                        ::= dn <destructor-name>
//
//<simple-id> ::= <source-name> [ <template-args> ]
<base - unresolved - name > :: = <simple - id > :: = on <operator - name > :: = on <operator - name > <template - args > :: = dn <destructor - name > <simple - id > :: = <source - name > [ <template - args > ]