| 1213 | |
| 1214 | |
| 1215 | QualifiedName DemangleGNU3::DemangleBaseUnresolvedName() |
| 1216 | { |
| 1217 | // <base-unresolved-name> ::= <simple-id> # unresolved name |
| 1218 | // ::= on <operator-name> # unresolved operator-function-id |
| 1219 | // ::= on <operator-name> <template-args> # unresolved operator template-id |
| 1220 | // ::= dn <destructor-name> # destructor or pseudo-destructor; |
| 1221 | // # e.g. ~X or ~X<N-1> |
| 1222 | |
| 1223 | indent() |
| 1224 | MyLogDebug("%s: '%s'\n", __FUNCTION__, m_reader.GetRaw().c_str()); |
| 1225 | QualifiedName out; |
| 1226 | if (m_reader.Length() > 1) |
| 1227 | { |
| 1228 | const string str = m_reader.PeekString(2); |
| 1229 | if (str == "on") |
| 1230 | { |
| 1231 | out.push_back(GetOperator(m_reader.Read(), m_reader.Read())); |
| 1232 | if (m_reader.Peek() == 'I') |
| 1233 | { |
| 1234 | m_reader.Consume(); |
| 1235 | vector<FunctionParameter> args; |
| 1236 | DemangleTemplateArgs(args); |
| 1237 | out.back() += GetTemplateString(args); |
| 1238 | PushType(CreateUnknownType(out)); |
| 1239 | } |
| 1240 | } |
| 1241 | else if (str == "dn") |
| 1242 | { |
| 1243 | string name = DemangleUnresolvedType().GetString(); |
| 1244 | if (name.empty()) |
| 1245 | out.push_back("~" + DemangleSourceName()); |
| 1246 | else |
| 1247 | out.push_back("~" + name); |
| 1248 | } |
| 1249 | else |
| 1250 | { |
| 1251 | // <simple-id> |
| 1252 | out.push_back(DemangleSourceName()); |
| 1253 | if (m_reader.Peek() == 'I') |
| 1254 | { |
| 1255 | m_reader.Consume(); |
| 1256 | vector<FunctionParameter> args; |
| 1257 | DemangleTemplateArgs(args); |
| 1258 | out.back() += GetTemplateString(args); |
| 1259 | } |
| 1260 | } |
| 1261 | } |
| 1262 | dedent(); |
| 1263 | return out; |
| 1264 | } |
| 1265 | |
| 1266 | |
| 1267 | TypeBuilder DemangleGNU3::DemangleUnresolvedType() |
nothing calls this directly
no test coverage detected