2013-11-20 1 views
1

컴파일 과정 :일반 연산자를 사용하여 -> * r- 수치로

Tool internal error: Internal Error: [Front end]: assertion failed at: "....\Translator\compiler_core\src\parser\edg\lower_il.c", line 13411

사실 그 충격 : 비 기본 유형 T 사용할 때

template <typename T> T GetMember(const T STRUCT_T::* member) 
{ 
    STRUCT_T* pStruct = GetStruct(); 
    ... 
    // read value 
    T retVal = pStruct->*member; // compiler assertion here 

    ReleaseStruct(); 

    return retVal; 
} 

인해 컴파일러 어서션 끝나는 IAR 컴파일러의 "lower_il.c"는 최소한 13,411 개의 라인을 가지고 있고 그 중 일부는 적절한 일반 연산자입니다 -> *(), 다음 함수가 비 기본 타입 T로 컴파일한다는 것을 알았습니다.

template <typename T> void SetMember(T STRUCT_T::* member, const T& value) 
{ 
    STRUCT_T* pStruct = GetStruct(); 
    ... 
    // write value 
    pStruct->*member = value; // no compiler assertion here 

    ReleaseStruct();  
} 

제네릭 연산자의 결과가 우변 값은 괜찮지 만 rvalue 값은 아닙니다. 매개 변수를 언 핑킹해도 도움이되지 않았습니다.

원인과 해결책에 대한 아이디어가 있으십니까?

+0

컴파일러를 업그레이드하지 않으면 내부 컴파일러 오류에 "해결책"이 없습니다. 가장 좋은 방법은 해결 방법입니다. – dasblinkenlight

+1

이것은 파서 오류처럼 보입니다. 'T retVal (pStruct -> * member)','T & retVal = pStruct -> * member', 또는'const T retValPtr * = & (pStruct -> * member) '와 같은 다른 구문을 사용하여 똑같은 것을 시도해보십시오. 회원)'. 간단히 말해, 컴파일러가 코드를 통해 다른 경로를 취하여 속여서 암기를 피하도록 무언가를하십시오. – dasblinkenlight

+0

"T retVal = * & (pDbAppDynamic -> * member)"가 작동했습니다. @ dasblinkenlight 정말 고마워. 나는 이것이 어떻게 일어날 수 있었는지 아는 것에 관심이있다. – lkanab

답변

0

IAR 서비스 팩 6.70.2가이 문제를 해결했습니다.

0

edg\lower_il.c에서 이것은 독점적 인 IAR 파서가 아니라 EDG 프론트 엔드임을 알 수 있습니다. EDG는 잘 관리되고 잘 존중되며, http://gcc.godbolt.org/에서 최신 버전을 사용할 수 있습니다. (컴파일러 메뉴에서 ICC를 선택하십시오.)

파일 이름은 초기 AST를 작성하지 않고 하위 레벨 중간 표현을 처리하고 있음을 나타냅니다. 더 원시적 인 조작으로 구성원 간 액세스를 변환하는 데 문제점이있을 수 있습니다. 또는 플래그가 잘못된 행에 나타날 수 있습니다. 내부 오류가 항상 정확한 것은 아닙니다. SSCCE이 더 좋을 것입니다.

관련 문제